【发布时间】:2016-02-01 11:08:48
【问题描述】:
使用GroupBy() 和Count() > 1 我试图在列表中查找我的类的重复实例。
类如下所示:
public class SampleObject
{
public string Id;
public IEnumerable<string> Events;
}
这就是我实例化和分组列表的方式:
public class Program
{
private static void Main(string[] args)
{
var items = new List<SampleObject>()
{
new SampleObject() { Id = "Id", Events = new List<string>() { "ExampleEvent" } },
new SampleObject() { Id = "Id", Events = new List<string>() { "ExampleEvent" } }
};
var duplicates = items.GroupBy(x => new { Token = x.Id, x.Events })
.Where(g => g.Count() > 1)
.Select(g => g.Key)
.ToList();
}
}
duplicates 不包含任何项目。我怎样才能使分组工作?
【问题讨论】:
-
默认情况下,列表不按项目的值进行比较。
-
@SergeyBerezovskiy - 这不是这里的问题。问题是缺少
GetHashCode和Equals覆盖。 -
@Enigmativity
new { Token = x.Id, x.Events }无法覆盖SampleObject的 Equals 和 GetHashCode。这里的问题完全是由x.Events比较引起的 -
虽然我不会使用
,作为分隔符,但@Farhad (string.Join) 提出的解决方案是经典的解决方案,而且通常“足够好”。我会使用'\0'作为分隔符。另一个“东西”......然后我会使用.Select(g => g.First())来检索重复的项目。 -
@SergeyBerezovskiy - 是的,很公平。我不得不求助于对原始对象使用自定义比较器。
标签: c# linq comparison grouping