用于比较字符串中的字符的算法

时间:2010-03-10 16:18:33

标签: c# linq

如何检查两个单词是否有共同的字符?

离。 :“word”和“letter”有共同的“r”

“word”和“email”没有任何共同的字符

这段代码错了,因为如果两个单词有两个共同的字符,我在结果中得到4

int numberOfCommonChars = (from c1 in word1.ToCharArray()
                           from c2 in word2.ToCharArray()
                           where c1 == c2
                           select c1).Count();

2 个答案:

答案 0 :(得分:5)

您的代码无效,因为使用多个from子句会创建一个完整的外部联接

您需要使用Intersect

int commonCount = word1.Intersect(word2).Count();

虽然它未在IntelliSense中显示,但String实现了IEnumerable<char>,因此您无需致电ToCharArray()

请注意,这只会计算每个字符一次,所以如果两个字符串包含两次相同的字符,则只计算一次。

如果要计算多次出现次数,请使用以下代码:

var commonChars = word1.Intersect(word2);
var commonCount = commonChars.Sum(c => Math.Min(
    word1.Count(q => q == c), 
    word2.Count(q => q == c)
));

答案 1 :(得分:0)

int numberOfCommonChars = (from c1 in word1.ToCharArray()
                            from c2 in word2.ToCharArray()
                            where c1 == c2
                            select c1).Distinct().Count();