确定字符串数组中是否出现多次字符串(C#)

AGu*_*ald 1 c# arrays string

我有一系列字符串,fe

string [] letters = { "a", "a", "b", "c" };
Run Code Online (Sandbox Code Playgroud)

我需要找到一种方法来确定数组中的任何字符串是否出现多次.我认为最好的方法是创建一个没有相关字符串的新字符串数组并使用Contains,

foreach (string letter in letters)
{
    string [] otherLetters = //?
    if (otherLetters.Contains(letter))
    {
        //etc.     
    }
}
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何.如果有人有这个或更好的方法的解决方案,请回答.

Dan*_*rth 10

最简单的方法是使用GroupBy:

var lettersWithMultipleOccurences = letters.GroupBy(x => x)
                                           .Where(g => g.Count() > 1)
                                           .Select(g => g.Key);
Run Code Online (Sandbox Code Playgroud)

这将首先使用字母作为键对数组进行分组.然后它只返回具有多个条目的组,并返回这些组的键.因此,您将IEnumerable<string>包含在原始数组中出现多次的所有字母.在您的示例中,这只是"a".

注意:因为LINQ是使用延迟执行实现的,所以lettersWithMultipleOccurences多次枚举,会多次执行分组和过滤.为避免这种情况,请调用ToList()结果:

var lettersWithMultipleOccurences = letters.GroupBy(x => x)
                                           .Where(g => g.Count() > 1)
                                           .Select(g => g.Key).
                                           .ToList();
Run Code Online (Sandbox Code Playgroud)

lettersWithMultipleOccurences现在将是类型List<string>.


Hei*_*nzi 5

您可以使用 LINQ 扩展方法:

if (letters.Distinct().Count() == letters.Count()) {
    // no duplicates
}
Run Code Online (Sandbox Code Playgroud)

Enumerable.Distinct删除重复项。因此,letters.Distinct()将在您的示例中返回三个元素。