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_Lambda - Fatal编程技术网

C# Linq查询对项目进行分组,并从每个组中的顶部项目进行查询

C# Linq查询对项目进行分组,并从每个组中的顶部项目进行查询,c#,linq,lambda,C#,Linq,Lambda,所以,我有一个类似这样的列表。它基本上是一组项目的状态历史,最新状态代表当前状态 Record Id State Date ===== === ========= ======= 1 A Waiting Jan 01 2 A InProgress Jan 02 3 A Finished Jan 03 4 B Waiting Ja

所以,我有一个类似这样的列表。它基本上是一组项目的状态历史,最新状态代表当前状态

Record   Id      State       Date
=====    ===     =========  =======
1        A       Waiting     Jan 01
2        A       InProgress  Jan 02
3        A       Finished    Jan 03
4        B       Waiting     Jan 02
5        C       Waiting     Jan 01
6        C       InProgress  Jan 02
7        D       Waiting     Jan 01
8        D       InProgress  Jan 02
我想要的是能够查询每个项目的“当前”状态。 例如,我想说:“给我所有的Id都是‘InProgress’”,并得到Id d和Id C,但不是Id A(因为它的最新状态是‘Finished’)

我知道我必须进行一些分组、排序或最大化,但我不能把它们全部放在一起。

myList.GroupBy(m=>m.Id)
myList.GroupBy(m => m.Id)
.Select(g => g.OrderByDescending(x => x.Date).First())
.Where(<your filter>);
.Select(g=>g.OrderByDescending(x=>x.Date).First()) .Where();
如果这是LINQ to对象(并且假设记录按正确的顺序排列),则可以执行以下操作:

var latestById = records.GroupBy(record => record.Id)
                        .ToDictionary(group => group.Key, group => group.Last());
这是因为分组中的“GroupBy”元素是按照它们在源代码中出现的顺序生成的

如果您不能保证记录顺序,我会:

var latestById = records.GroupBy(record => record.Id)
                        .Select(group => group.MaxBy(r => r.Date))
                        .ToDictionary(record => record.Id);
var latestById = records.GroupBy(record => record.Id)
                        .Select(group => group.OrderByDescending(r => r.Date).First())
                        .AsEnumerable()
                        .ToDictionary(record => record.Id);
从哪里来

顺便说一下,如果这是LINQ to SQL,我会:

var latestById = records.GroupBy(record => record.Id)
                        .Select(group => group.MaxBy(r => r.Date))
                        .ToDictionary(record => record.Id);
var latestById = records.GroupBy(record => record.Id)
                        .Select(group => group.OrderByDescending(r => r.Date).First())
                        .AsEnumerable()
                        .ToDictionary(record => record.Id);

这里有一些代码可以实现您想要的功能。它获取每个id的最新状态,并忽略已完成的记录。我提供了一个完整的工作示例,您可以运行它(并希望能够适应实际数据的工作)

这是LinqPad的输出


您会注意到,除了“A”之外,我们还有每个项目的最新状态,该状态已被忽略,因为它已完成。

到目前为止您尝试了什么?向我们展示您对分组排序和max所做的工作,我们可以告诉您哪里出了问题。学习比仅仅得到解决方案要好得多……我们不知道它们在源代码中出现的顺序是日期顺序,是吗?它们在示例中,但他没有说记录是按日期顺序排列的。吹毛求疵,但这正是臭虫的来源…@克里斯:看起来是这样,但如果不是这样的话,我已经提供了一种方法。谢谢。我认为这是一个更好的答案