【问题标题】:LINQ Check List<string> for multiple entries [duplicate]多个条目的 LINQ 检查列表<字符串> [重复]
【发布时间】:2015-09-03 12:02:15
【问题描述】:

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

我有一个列表,我只想检查(使用 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 ...
}

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

【问题讨论】:

  • 你不需要最终的Select(y =&gt; y),但除此之外,这个或当前的答案就可以了。
  • listWithMultipleEntries.Distinct().Count() == listWithMultipleEntries.Count;
  • 为什么有人使用Count()?在大多数答案(和这个问题)中,.Skip(1).Any() 完全可以工作,如果你将它应用于不是ICollectionIEnumerable 会更快。
  • @Oliver 你能给出整个 linq 声明吗?
  • @veritas:我们开始吧:listToCheck.GroupBy(x =&gt; x).Where(g =&gt; g.Skip(1).Any()).Any()。但我会删除最后一个 Any() 并迭代结果以提供有关多次发生的情况的反馈。

标签: c# linq


【解决方案1】:

group by 选项可能是最好的,但你也可以这样做

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

【讨论】:

    【解决方案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 ...
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

                  List<string> list = new List<string>()
                  {
                      "Hello",
                      "World",
                      "!",
                      "Hello"
                  };
          
                  bool hasDuplicates = list.Where((l, i) => list.LastIndexOf(l) != i).Any();
          
                  Console.WriteLine(hasDuplicates);
          

          输出:true

          【讨论】:

            猜你喜欢
            • 2019-04-30
            • 1970-01-01
            • 2018-06-03
            • 2012-12-06
            • 2017-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-16
            相关资源
            最近更新 更多