Distinct() не работает

у меня есть следующее выражение LINQ:

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

но по какой-то причине коллекция AgentsFilter полна дубликатов. Что случилось с моим Distinct()?

4 ответов


Distinct использовать Equals метод on 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
});

возможно, вы не предоставили реализацию обоих GetHashCode и Equals on NameValueGuid.

кроме того, если это невозможно, вы можете передать экземпляр IEqualityComparer<NameValueGuid> на ваш вызов Distinct.

см.: http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx


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

вам нужно определить, что 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