问题
I have the following linq expression:
AgentsFilter = new BindableCollection<NameValueGuid>((
from firstEntry in FirstEntries
select new NameValueGuid {
Name = firstEntry.Agent,
Value = firstEntry.AgentId
}).Distinct()
);
But because of some reason, the AgentsFilter Collection is full of duplicates. What is wrong with my Distinct()
?
回答1:
Distinct
will use the Equals
method on NameValueGuid
to find duplicates. IF you do not override Equals
, then it will check references.
You can add an extra step to avoid overriding Equals, by using an anonymous type. Anonymous types automatically override Equals and GetHashCode to compare each member. Doing the distinct on the anonymous type, then projecting that onto your class will solve the problem.
from firstEntry in FirstEntries
select new
{
Name = firstEntry.Agent,
Value = firstEntry.AgentId
}).Distinct().Select(x => new NameValueGuid
{
Name = x.Name,
Value = x.Value
});
回答2:
You might not have supplied an implementation of both GetHashCode
and Equals
on NameValueGuid
.
Alternatively, if that isn't possible, you can pass an instance of IEqualityComparer<NameValueGuid>
to your call of Distinct
.
See: http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx
回答3:
select new
{
Name = firstEntry.Agent,
Value = firstEntry.AgentId
})
.Distinct()
.Select(x => new NameValueGuid
{
Name = x.Name,
Value = x.Value
});
回答4:
You need to define what Distinct
means in the context of a class with Name
and Value
properties. See MSDN.
Try the overload of Distinct that lets you provide a comparer.
For example:
AgentsFilter = new BindableCollection<NameValueGuid>((from firstEntry in FirstEntries
select new NameValueGuid
{
Name = firstEntry.Agent,
Value = firstEntry.AgentId
})
.Distinct((nvg) => nvg.Value)
);
Alternatively, if you have access to the code definition of NameValueGuid, then you can override GetHashCode
and Equals
as appropriate for the class. Again, see MSDN
来源:https://stackoverflow.com/questions/11884255/distinct-doesnt-work