Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq对序列的子序列应用滤波器_C#_Linq_Collections - Fatal编程技术网

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),但也是一个子序列。