LINQ检查列表<string>表示多个条目

时间:2015-09-03 12:02:16

标签: c# linq

令人惊讶的是,我还没有为以下行为找到一个简单的解决方案。

我有一个List,我只想检查(使用Linq)是否有多​​个条目。这意味着,我想得到一个布尔。

例如:

List<string> listWithMultipleEntries = new List<string>()
{
    "Hello",
    "World",
    "!",
    "Hello"
};

这可能是我已经结束的解决方案(我没有进行过广泛测试,但似乎有效)

if (listToCheck.GroupBy(x => x).Where(g => g.Count() > 1).Select(y => y).Any())
{
    // Do something ...
}

但如果没有更简单的解决方案,我会感到惊讶 (我真的没找到一个)

5 个答案:

答案 0 :(得分:8)

分组选项可能是最好的,但您也可以

if (listToCheck.Distinct().Count() != listToCheck.Count())
{
    // Do sth.
}

答案 1 :(得分:2)

这应该是确定列表是否有重复的最有效方法

public static bool HasDuplicates<T>(this IEnumerable<T> list)
{
    HashSet<T> distinct = new HashSet<T>();
    foreach (var s in list)
    {
        if (!distinct.Add(s))
        {
            return true;
        }
    }
    return false;
}

所以你可以......

if (listToCheck.HasDuplicates())
{
    // Do something ...
}

答案 2 :(得分:1)

我会使用ExtensionMethod进行此类检查。您可以通过多种方式检查是否存在重复项,但最简单的方法之一是:

public static bool ContainsDuplicates<T>(this IEnumerable<T> list)
{
    return list.Any(element => list.Count(e => e.Equals(element)) > 1);
}

答案 3 :(得分:1)

两个解决方案,一个使用GroupBy(),另一个使用Disctinct()

var hasDuplicates = listWithMultipleEntries.GroupBy(x => x).Any(g => g.Count() > 1);

var hasDuplicates = listWithMultipleEntries.Distinct().Count() != listWithMultipleEntries.Count;

答案 4 :(得分:0)

其他解决方案可能是比较元素索引:

        List<string> list = new List<string>()
        {
            "Hello",
            "World",
            "!",
            "Hello"
        };

        bool hasDuplicates = list.Where((l, i) => list.LastIndexOf(l) != i).Any();

        Console.WriteLine(hasDuplicates);

输出:true