我有以下linq表达式:
AgentsFilter = new BindableCollection<NameValueGuid>((
from firstEntry in FirstEntries
select new NameValueGuid {
Name = firstEntry.Agent,
Value = firstEntry.AgentId
}).Distinct()
);
但由于某种原因,AgentsFilter Collection充满了重复。我的Distinct()
有什么问题?
答案 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
上提供Equals
和NameValueGuid
的实施。
或者,如果无法做到这一点,您可以将IEqualityComparer<NameValueGuid>
的实例传递给Distinct
。
请参阅:http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx
答案 2 :(得分:4)
您需要在具有Distinct
和Name
属性的类的上下文中定义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的代码定义,则可以根据类别覆盖GetHashCode
和Equals
。再次,请参阅MSDN
答案 3 :(得分:4)
select new
{
Name = firstEntry.Agent,
Value = firstEntry.AgentId
})
.Distinct()
.Select(x => new NameValueGuid
{
Name = x.Name,
Value = x.Value
});