C# 使用LINQ将数据行选择到新结构中。调用Distinct()失败
考虑这两种结构:C# 使用LINQ将数据行选择到新结构中。调用Distinct()失败,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,考虑这两种结构: struct Task { public Int32 Id; public String Name; public List<Registration> Registrations; } struct Registration { public Int32 Id; public Int32 TaskId; public String Comment; public Double Hours; } 我错过了什
struct Task
{
public Int32 Id;
public String Name;
public List<Registration> Registrations;
}
struct Registration
{
public Int32 Id;
public Int32 TaskId;
public String Comment;
public Double Hours;
}
我错过了什么?
Distinct()
是否检查属性值以外的内容?LINQ的Distinct
方法使用对象的等于和GetHashCode
实现来比较对象。
因此,如果这些方法没有被重写,它将通过引用而不是通过值进行比较
您需要使用EqualityComparer
。(或者为任务
类实现Equals
和GetHashCode
)我猜这就是其中的列表。几乎可以肯定,这两个列表对象是不同的,即使它们包含相同的信息……这无疑是注册列表中的失败。参考文献,在这种情况下,将是什么?@ RooStOxo:默认情况下,如果引用相同的实例,它只会考虑两个引用相等。谢谢SLaks。这真让我大吃一惊:)
var tasks = data.AsEnumerable().Select(t => new Task
{
Id = Convert.ToInt32(t["ProjectTaskId"]),
Name = Convert.ToString(t["ProjectTaskName"]),
Registrations = new List<Registration>()
});
class TaskIdComparer : IEqualityComparer<Task>
{
public bool Equals(Task x, Task y)
{
return x.Id == y.Id;
}
public Int32 GetHashCode(Task t)
{
return t.Id.GetHashCode();
}
}