【问题标题】:How do we find duplicates in a list of objects [duplicate]我们如何在对象列表中找到重复项[重复]
【发布时间】:2016-01-05 20:36:29
【问题描述】:

我们如何在基于多个属性的对象列表中找到重复项?

如果列表是否包含欺骗,则以下代码不会返回。

var dups = ListItems.GroupBy(i => new { i.Value, i.Code })
                    .Where(g => g.Count() >= 1)
                    .Select(g => new 
                     { 
                        Length = g.Key.Value,
                        Label = g.Key.Code,
                        Count = g.Count()
                      });

【问题讨论】:

  • 亲爱的拉古!请提供编程语言的标签。使用代码格式(编辑器面板中的反引号或 {} 按钮)
  • 我想这个问题之前有人问过。此外,第二句不清楚您的代码是否根本没有返回,或者您是否希望它会告诉您列表中是否有重复项。

标签: c# linq duplicates


【解决方案1】:

我猜你的条件Where(g => g.Count() >= 1) 有错误,它将返回包含一个或多个项目的所有组(实际上所有组都至少有一个项目,所以这个条件总是正确的)。

如果您只想获取重复项,则应该是:Where(g => g.Count() > 1)

所以结果代码将是:

var dups = ListItems.GroupBy(i => new { i.Value, i.Code })
                    .Where(g => g.Count() > 1)
                    .Select(g => new 
                     { 
                        Length = g.Key.Value,
                        Label = g.Key.Code,
                        Count = g.Count()
                     });

这样,在dups 中,您将拥有多个包含重复的ValueCode 的项目组。

另外我认为如果你在Where 之前调用Select 会更好,因为现在你要计算组中的项目计数两次,在Where 内部检查条件,在Select 内部存储计数。

如果您在Select 之后调用Where,您将能够使用存储的组计数值进行过滤,如下所示:

var dups = ListItems.GroupBy(i => new { i.Value, i.Code })
                    .Select(g => new 
                     { 
                        Length = g.Key.Value,
                        Label = g.Key.Code,
                        Count = g.Count()
                     })
                    .Where(g => g.Count > 1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2015-01-21
    • 2013-02-21
    • 2014-09-17
    • 2013-03-29
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多