Применение фильтра к подпоследовательностям последовательности с использованием Linq - PullRequest
0 голосов
/ 24 ноября 2010

Если у меня есть List<MyType>, то есть каждая строка, представляющая элемент в коллекции:

{{ Id = 1, Year = 2010 },
{ Id = 1, Year = 2009 },
{ Id = 1, Year = 2008 },
{ Id = 2, Year = 2010 },
{ Id = 2, Year = 2009 },
{ Id = 2, Year = 2008 }}

Я хочу получить из этой коллекции коллекцию самого последнего элемента для каждого идентификатора.Как будет выглядеть Linq для этого?

Желаемый результат:

{{ Id = 1, Year = 2010 },
{ Id = 2, Year = 2010 }}

У меня есть реализация naiive, использующая вторую переменную списка и цикл foreach, но он неэффективен.

//naiive implementation "p-code"
//...
var mostRecentItems = new List<MyType>();    
var ids = collection.Select(i => i.Id).Distinct();
foreach(var id in ids)
{
  mostRecentItems.Add(collection.Where(i => i.Id == id).OrderByDescending().First);
}

return mostRecentItems;

Ответы [ 3 ]

4 голосов
/ 24 ноября 2010

Проще всего:

var mostRecentById = from item in list
                     group item by item.Id into g
                     select g.OrderByDescending(x => x.Year).First();
1 голос
/ 24 ноября 2010

Сгруппируйте по идентификатору, затем выберите первый элемент в каждой группе, упорядоченный по убыванию.

 var mostRecentItems = collection.GroupBy( c => c.Id )
                                 .Select( g => g.OrderByDescending( i => i.Year ).First() );
0 голосов
/ 25 ноября 2010

или более просто:

var result = list
                .GroupBy(i => i.Id)
                .Select(g => new {Id = g.Key, Year = g.Max(y => y.Year)});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...