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

时间:2011-09-06 10:35:20

标签: c# arrays string

我有一个字符串数组,f.e。

string [] letters = { "a", "a", "b", "c" };

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

foreach (string letter in letters)
{
    string [] otherLetters = //?
    if (otherLetters.Contains(letter))
    {
        //etc.     
    }
}

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

4 个答案:

答案 0 :(得分:10)

最简单的方法是使用GroupBy

var lettersWithMultipleOccurences = letters.GroupBy(x => x)
                                           .Where(g => g.Count() > 1)
                                           .Select(g => g.Key);

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

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

var lettersWithMultipleOccurences = letters.GroupBy(x => x)
                                           .Where(g => g.Count() > 1)
                                           .Select(g => g.Key).
                                           .ToList();

lettersWithMultipleOccurences现在属于List<string>类型。

答案 1 :(得分:4)

您可以使用LINQ扩展方法:

if (letters.Distinct().Count() == letters.Count()) {
    // no duplicates
}

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

答案 2 :(得分:1)

从数组中创建HashSet并比较它们的大小:

var set = new HashSet(letters);
bool hasDoubleLetters = set.Size == letters.Length;

答案 3 :(得分:1)

HashSet将为您提供良好的性能:

HashSet<string> hs = new HashSet<string>();
foreach (string letter in letters)
{
    if (hs.Contains(letter))
    {
        //etc. more as once     
    }
    else
    {
           hs.Add(letter);
    }
}