使用Linq将过滤器应用于序列的子序列

时间:2010-11-24 19:13:15

标签: c# linq collections

如果我有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 }}

我希望从每个Id的最新项目的此集合中检索一个集合。 Linq对此有什么看法?

期望的输出:

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

我有一个使用第二个列表变量和一个foreach循环的naiive实现,但效率很低。

//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 个答案:

答案 0 :(得分:4)

最简单:

var mostRecentById = from item in list
                     group item by item.Id into g
                     select g.OrderByDescending(x => x.Year).First();

答案 1 :(得分:1)

按ID分组,然后选择以降序排列的每个组中的第一个项目。

 var mostRecentItems = collection.GroupBy( c => c.Id )
                                 .Select( g => g.OrderByDescending( i => i.Year ).First() );

答案 2 :(得分:0)

或更简单地说:

var result = list
                .GroupBy(i => i.Id)
                .Select(g => new {Id = g.Key, Year = g.Max(y => y.Year)});