2015-03-26 3 views
1

У меня есть List<T> объект:Получение различных значений по двум полям

List<MyCampaignClass> campaignsToProcess = new List<MyCampaignClass>(); 

я сделать некоторую фильтрацию восходящего потока данных через LINQ.

var results= from h in campaignHistory 
      join a in campaignAvailability 
      on new { h.campaignId, h.reportDate } equals new { a.campaignId, a.reportDate } 
      where h.operationDate >= a.startDate 
      select h; 

Затем я добавляю его в свой текущий объект List<T>. Я хочу различать два значения в объявленном классе: MyCampaignClass.campaignId и MyCampaignClass.reportDate.

results.Select(m => 
    new MyCampaignClass() 
    { 
     campaignId = m.campaignId, 
     reportDate = m.reportDate 
    }) 
    .Distinct() //doesn't work 
    .ToList() 
    .ForEach(p => campaignsToProcess.Add(p)); 

Я не могу обернуть мою голову вокруг, почему .Distinct() не работает.

+0

Что вы подразумеваете под 'is not working.' –

+0

Что добавляется в мой список в строке' .ForEach (p => campaignToProcess.Add (p)) '. Я получаю дубликаты. – Kyle

+2

'Distinct' полагается на объекты в вашей коллекции, переопределяя' Equals' и 'GetHashCode', если они этого не делают, тогда он будет использовать ссылочное равенство и, вероятно, все будет« отличным ». Существует перегрузка, которая принимает 'IEqualityComparer ', который вы можете использовать. – juharr

ответ

3

Существует простой способ, вы можете использовать анонимный тип первый затем сделать еще один выступ, чтобы преобразовать их MyCampaignClass

historyResults 
.Select(m => new { m.campaignId, m.reportDate }) 
.Distinct() 
.Select(m => 
new MyCampaignClass() 
{ 
    campaignId = m.campaignId, 
    reportDate = m.reportDate 
}); 

Это будет работать, потому что анонимные типы сравниваются значения свойств, а не их ссылки.

Другой способ переопределить Equals и GetHashcode метод должным образом в вашем MyCampaignClass или реализовать IEqualityComparer<T> для своего класса и передать его Distinct методу.

+0

Аккуратный трюк, чтобы выбрать анонимный тип! Другое решение - реализовать «DistinctBy», как в MoreLinq http://code.google.com/p/morelinq/source/browse/MoreLinq/DistinctBy.cs –

Смежные вопросы