15

我有以下 linq 表达式:

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

但由于某种原因,AgentsFilter 集合中充满了重复项。我怎么了Distinct()

4

4 回答 4

37

Distinct将使用Equalson 方法NameValueGuid查找重复项。如果您不覆盖Equals,那么它将检查引用。

您可以通过使用匿名类型添加额外的步骤来避免覆盖 Equals。匿名类型会自动覆盖 Equals 和 GetHashCode 以比较每个成员。对匿名类型执行不同的操作,然后将其投影到您的类上将解决问题。

from firstEntry in FirstEntries
select new
{ 
    Name = firstEntry.Agent,
    Value = firstEntry.AgentId
}).Distinct().Select(x => new NameValueGuid
{
    Name = x.Name,
    Value = x.Value
});
于 2012-08-09T13:17:01.337 回答
10

您可能没有提供 bothGetHashCodeEqualson的实现NameValueGuid

或者,如果这不可能,您可以将一个实例传递IEqualityComparer<NameValueGuid>给您的Distinct.

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

于 2012-08-09T13:17:36.473 回答
4

您需要定义在具有和属性Distinct的类的上下文中的含义。请参阅MSDNNameValue

尝试让您提供比较器的 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

于 2012-08-09T13:18:06.520 回答
4
select new
{ 
    Name = firstEntry.Agent,
    Value = firstEntry.AgentId
})
.Distinct()
.Select(x => new NameValueGuid
{
    Name = x.Name,
    Value = x.Value
});
于 2012-08-09T13:21:18.110 回答