如果我有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;
答案 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)});