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