我有一个字符串数组,f.e。
string [] letters = { "a", "a", "b", "c" };
我需要找到一种方法来确定数组中的任何字符串是否出现多次。 我认为最好的方法是创建一个没有相关字符串的新字符串数组,并使用Contains,
foreach (string letter in letters)
{
string [] otherLetters = //?
if (otherLetters.Contains(letter))
{
//etc.
}
}
但我无法弄清楚如何。 如果有人有这个或更好的方法的解决方案,请回答。
答案 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);
}
}