Okay, wie wäre es damit, den Vorteil der Maximierung lazy evaluation hat und String-Manipulation zu minimieren.
essentialally, es gruppiert jede Seite von char, dann findet Zeichen, die eine Gruppe auf beiden Seiten haben. Die übereinstimmenden Gruppen werden im Tandem gezählt, bis einer der beiden ausläuft. Diese Zählungen werden summiert, um das Ergebnis zu erzeugen.
Es wäre trivial, dies generisch für jede zwei Sequenzen durchzuführen. Siehe unten,
public static int CommomCount<T>(
this IEnumerable<T> source,
IEnumerable<T> sequence,
IEqualityComparer<T> comparer = null)
{
if (sequence == null)
{
return 0;
}
if (comparer == null)
{
comparer = EqualityComparer<T>.Default;
}
return source.GroupBy(t => t, comparer)
.Join(
sequence.GroupBy(t => t, comparer),
g => g.Key,
g => g.Key,
(lg, rg) => lg.Zip(rg, (l, r) => l).Count(),
comparer)
.Sum();
}
, die Sie mögen diese verwenden würden.
"G12AA".CommonCount("GAA2")
Die optionalen comparer
Parameter können nützlich sein, wenn Sie Groß- und Kleinschreibung oder andere spezielle Behandlung erfordern.
Im Interesse der resuability, würde ich ein IEnumerable<T>
die Sum()
und Rückkehr zu entfernen versucht sein, und dann Summe zum Anruf hinzufügen, wie diese,
public static IEnumerable<T> Commom<T>(
this IEnumerable<T> source,
IEnumerable<T> sequence,
IEqualityComparer<T> comparer = null)
{
if (sequence == null)
{
return Enumerable.Empty<T>();
}
if (comparer == null)
{
comparer = EqualityComparer<T>.Default;
}
return source.GroupBy(t => t, comparer)
.Join(
sequence.GroupBy(t => t, comparer),
g => g.Key,
g => g.Key,
(lg, rg) => lg.Zip(rg, (l, r) => l),
comparer)
.SelectMany(g => g);
}
so könnte man leicht tun
Console.WriteLine(new string("G12AA".Common("GAA2").ToArray()));
oder nur die orgininal
"G12AA".Common("GAA2").Count();
Könnte klassisch sein, aber hast du _anything_ bisher versucht? –
Ich habe eine Methode, die zwei Zeichenfolgen für Ähnlichkeiten vergleicht, aber mit den Zeichen in den gleichen Indizes, dies ist jedoch völlig anders. – Tommy
"G12AA" & "GA2" sollte 4 zurückgeben? und "GA2" & "G12AA" sollte 4 zurückgeben? –