【问题标题】:How to find duplicate items in list<>? [duplicate]如何在列表<>中查找重复项? [复制]
【发布时间】:2013-03-29 19:23:06
【问题描述】:

我有:

List<string> list = new List<string>() { "a", "a", "b", "b", "r", "t" };

我怎样才能只得到“a”,“b”?

我试着这样做:

List<string> list = new List<string>() { "a", "a", "b", "b", "r", "t" };
List<string> test_list = new List<string>(); 

test_list = list.Distinct().ToList();

现在 test_list 有 {"a", "b", "r", "t"}
然后:

test_list = test_list.Except(list).ToList();

这就是我的失败点,原因是 except() 删除了所有元素。

你能帮我解决一下吗?

【问题讨论】:

  • 看看GroupBy方法。
  • 完全预期的行为。 except() 从 test_list 中排除在列表中找到的所有条目。你想做什么?
  • 这是最后的单身汉工作 =) 我正在做一个系统,通过选择的过滤器从数据库中搜索单词
  • Alex,因为the @Sachin's answer 是最好的,正如您在评论中指出的那样,您应该通过单击该答案左侧的浅复选标记来接受它作为答案,以帮助其他人理解问题已回答

标签: c# linq list


【解决方案1】:

试试这个

var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList();

【讨论】:

  • 我不明白为什么这个答案被赞成。有人用{ "a", "a", "b", "b", "a", "r", "t" } 试过吗?
  • 可以这样做。老实说,对于为什么这种方法确实有效,我不得不思考太久。我更喜欢l4V;更具可读性和重点。编辑:也许它更快,但我怀疑在这种情况下性能是否有任何问题。
  • I4V,你说得对,它不能正常工作
  • @ChrisSinclair 好吧,我认为关键是这个不起作用。如果你输入{ "a", "a", "b", "b", "a", "r", "t" },你就会退出"a" "a" "b"
  • @MatthewWatson 我正在对另一位发帖人(忘记名字)发表评论,他建议进行更正(见 MarcinJuraszek 的回答),但他们随后删除了他们的评论。
【解决方案2】:
var duplicates = list.GroupBy(s => s).SelectMany(g => g.Skip(1).Take(1)).ToList();

【讨论】:

  • 这是@Sachin's answer 的第一个版本不正确,请参阅它的 cmets 及其编辑
  • 这对我来说是最好的选择。我在我的问题中错过了一点:如果我有 {a,a,a,b,b,r},那么在输出中我应该得到 {a,a,b}
【解决方案3】:

一个简单的方法是使用Enumerable.GroupBy:

var dups = list.GroupBy(s => s)
               .Where(g => g.Count() > 1)
               .Select(g => g.Key);

【讨论】:

    【解决方案4】:
    List<string> list = new List<string>() { "a", "a", "b", "b", "r", "t" };
    
    var dups = list.GroupBy(x => x)
        .Where(x => x.Count() > 1)
        .Select(x => x.Key)
        .ToList();
    

    【讨论】:

    • 这个更易读易懂,谢谢
    【解决方案5】:
    var duplicates = list.GroupBy(a => a).SelectMany(ab => ab.Skip(1).Take(1)).ToList();
    

    它比使用Where(g =&gt; g.Count() &gt; 1) 的效率更高,并且每个组只返回一个元素。

    【讨论】:

      【解决方案6】:
      var list = new List<string> { "a", "a", "b", "b", "r", "t" };
      
      var distinct = new HashSet<string>();    
      var duplicates = new HashSet<string>();
      
      foreach (var s in list)
          if (!distinct.Add(s))
              duplicates.Add(s);
      
      // distinct == { "a", "b", "r", "t" }
      // duplicates == { "a", "b" }
      

      【讨论】:

      • +1 可能是最有效的方法。
      猜你喜欢
      • 2014-09-03
      • 1970-01-01
      • 2013-02-21
      • 2018-04-08
      • 2021-10-19
      • 2023-03-15
      • 2013-11-17
      • 1970-01-01
      相关资源
      最近更新 更多