Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ将数据行选择到新结构中。调用Distinct()失败_C#_Linq_Linq To Objects - Fatal编程技术网

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