C# 使用Linq对序列的子序列应用滤波器
如果我有一个C# 使用Linq对序列的子序列应用滤波器,c#,linq,collections,C#,Linq,Collections,如果我有一个列表,每一行代表集合中的一个项目: {{ 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 =
列表
,每一行代表集合中的一个项目:
{{ 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 }}
我有一个使用第二个list变量和foreach循环的naive实现,但效率很低
//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;
//NAIVE实现“p-code”
//...
var mostRecentItems=新列表();
var Id=collection.Select(i=>i.Id).Distinct();
foreach(id中的变量id)
{
添加(collection.Where(i=>i.Id==Id.OrderByDescending().First);
}
返回最大百分之三十;
最简单的方法是:
var mostRecentById = from item in list
group item by item.Id into g
select g.OrderByDescending(x => x.Year).First();
最简单的是:
var mostRecentById = from item in list
group item by item.Id into g
select g.OrderByDescending(x => x.Year).First();
按id分组,然后以降序方式选择每组中的第一项
var mostRecentItems = collection.GroupBy( c => c.Id )
.Select( g => g.OrderByDescending( i => i.Year ).First() );
按id分组,然后以降序方式选择每组中的第一项
var mostRecentItems = collection.GroupBy( c => c.Id )
.Select( g => g.OrderByDescending( i => i.Year ).First() );
或者更简单地说:
var result = list
.GroupBy(i => i.Id)
.Select(g => new {Id = g.Key, Year = g.Max(y => y.Year)});
或者更简单地说:
var result = list
.GroupBy(i => i.Id)
.Select(g => new {Id = g.Key, Year = g.Max(y => y.Year)});
谢谢TBH,我还没有完全了解GroupBy。如果有人知道一个简单的解释,请在网上发布。@Ben:这将所有具有相同ID的内容组合在一起,然后按年份对每个组进行排序,然后取第一个值,即具有最高年份的值。@Jon,“组”在概念上类似于临时表吗?澄清:分组是否会导致一系列子序列与可执行子查询的“依据”匹配?@Ben:是-每个组都有一个键属性(本例中的Id),但也是一个子序列。谢谢。TBH,我还没有完全了解GroupBy。如果有人知道一个简单的解释,请在网上发布。@Ben:这将所有具有相同ID的内容组合在一起,然后按年份对每个组进行排序,然后取第一个值,即具有最高年份的值。@Jon,“组”在概念上类似于临时表吗?澄清:分组是否会产生一系列子序列,这些子序列与可执行子查询的“by”匹配?@Ben:是-每个组都有一个键属性(本例中的Id),但也是一个子序列。