如何在对象列表中找到重复项

26 浏览
0 Comments

如何在对象列表中找到重复项

如何根据多个属性在对象列表中找到重复项?

以下的代码无法返回列表中是否包含重复项。

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()
                      });

0
0 Comments

我们如何在对象列表中找到重复项?

在上述代码中,我猜测条件`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`中你将会有多于一个项、具有重复的`Value`和`Code`的组。

我认为最好在`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);

0