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