Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Возможно, вы не выполнили реализацию как GetHashCode, так и Equals на NameValueGuid.

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

Смотрите: http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx

Ответ 3

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

Ответ 4

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