好吧,这个怎么样,它的优点是最大化惰性求值和最小化字符串操作。
public int CommonChars(string left, string right)
{
return left.GroupBy(c => c)
.Join(
right.GroupBy(c => c),
g => g.Key,
g => g.Key,
(lg, rg) => lg.Zip(rg, (l, r) => l).Count())
.Sum();
}
本质上,它按字符对每一边进行分组,然后找到两边都有一个组的字符。匹配的组被串联计数,直到任何一个用完。这些计数相加得出结果。
对任何两个序列进行一般性的执行都是微不足道的。见下文,
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();
}
你会像这样使用它。
"G12AA".CommonCount("GAA2")
如果您需要不区分大小写或其他特殊处理,可选的comparer 参数可能会很有用。
为了可重复使用,我很想删除 Sum() 并返回 IEnumerable<T>,然后将 sum 添加到调用中,像这样,
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);
}
这样你就可以轻松做到
Console.WriteLine(new string("G12AA".Common("GAA2").ToArray()));
或者只是原始的
"G12AA".Common("GAA2").Count();