Distinct()不起作用

时间:2012-08-09 13:12:50

标签: c# .net linq distinct

我有以下linq表达式:

AgentsFilter = new BindableCollection<NameValueGuid>((
    from firstEntry in FirstEntries
    select new NameValueGuid { 
        Name = firstEntry.Agent,
        Value = firstEntry.AgentId
    }).Distinct()
);

但由于某种原因,AgentsFilter Collection充满了重复。我的Distinct()有什么问题?

4 个答案:

答案 0 :(得分:31)

Distinct将使用Equals上的NameValueGuid方法查找重复项。如果你没有覆盖Equals,那么它将检查引用。

您可以使用匿名类型添加额外的步骤以避免覆盖Equals。匿名类型会自动覆盖Equals和GetHashCode以比较每个成员。在匿名类型上执行distinct,然后将其投射到您的类上将解决问题。

from firstEntry in FirstEntries
select new
{ 
    Name = firstEntry.Agent,
    Value = firstEntry.AgentId
}).Distinct().Select(x => new NameValueGuid
{
    Name = x.Name,
    Value = x.Value
});

答案 1 :(得分:8)

您可能未在GetHashCode上提供EqualsNameValueGuid的实施。

或者,如果无法做到这一点,您可以将IEqualityComparer<NameValueGuid>的实例传递给Distinct

请参阅:http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx

答案 2 :(得分:4)

您需要在具有DistinctName属性的类的上下文中定义Value的含义。请参阅MSDN

尝试使用Distinct的重载来提供比较器。

例如:

AgentsFilter = new BindableCollection<NameValueGuid>((from firstEntry in FirstEntries
    select new NameValueGuid
    { 
        Name = firstEntry.Agent,
        Value = firstEntry.AgentId
    })
    .Distinct((nvg) => nvg.Value)
);

或者,如果您可以访问NameValueGuid的代码定义,则可以根据类别覆盖GetHashCodeEquals。再次,请参阅MSDN

答案 3 :(得分:4)

select new
{ 
    Name = firstEntry.Agent,
    Value = firstEntry.AgentId
})
.Distinct()
.Select(x => new NameValueGuid
{
    Name = x.Name,
    Value = x.Value
});