C# C linq lambda表达式按多列分组,并获取组的第一项
这就是我的表数据的样子C# C linq lambda表达式按多列分组,并获取组的第一项,c#,linq,group-by,C#,Linq,Group By,这就是我的表数据的样子 Id C1 C2 C3 ------------------------------------------------- 1 John 1990 A 2 John 1990 B 3 John 2000 C
Id C1 C2 C3
-------------------------------------------------
1 John 1990 A
2 John 1990 B
3 John 2000 C
4 Mary 2001 D
5 Mary 2010 E
6 Mary 2010 F
7 Jack 2010 G
8 Jack 2010 H
9 Jack 2011 I
我想做的是,我想按C1,C2列分组,并得到每组的第一项,按C3列降序排列。
所以结果会是这样的
Id C1 C2 C3
-------------------------------------------------
1 John 1990 B
3 John 2000 C
4 Mary 2001 D
5 Mary 2010 F
7 Jack 2010 H
9 Jack 2011 I
我还想使用skip-And-take函数过滤第2到第5行。
所以最终的结果应该是
Id C1 C2 C3
-------------------------------------------------
3 John 2000 C
4 Mary 2001 D
5 Mary 2010 F
7 Jack 2010 H
我试过的是
await data.GroupBy(d => new { d.C1, d.C2 }).Skip(1).Take(4).FirstAsync();
但它只运行了一行。
如何解决此问题?您需要进行选择,因为将有多个结果,所以您需要使用ToListSync
你可以通过
using System;
using System.Linq;
using System.Collections.Generic;
...
var result = await data.GroupBy(d => new { d.C1, d.C2 }) //Group by C1 and C2
.Select(s => s.First()) //Select first record from each Group
.Skip(1) //Skip first record
.Take(4) //Pick up next 4 records
.ToListAsync() //Convert 4 records to List.
first和firstOrDefault,哪个更好?@StevenSann firstOrDefault不需要,因为GroupBy总是返回一组没有空集合的项目。@juharr,谢谢你提供的信息。我不知道这个事实。我更新了我的答案First@StevenSann,可以使用First或FirstOrDefault。有关@prasadelkikikar的更多信息,is.Selectgrp=>grp.First将随机重新运行一行组?我可以订第一排吗?在我的问题中,我想按C3列降序排列。所以第一行应该是'2 John 1990 B`first和firstOrDefault,哪一个更好?@StevenSann在这种情况下都可以工作,但使用first是安全的,因为从GroupBy生成的组不能为空。is.Selectgrp=>grp.first将随机重新运行一行组?我可以订第一排吗?在我的问题中,我想按C3列降序排列。所以第一行应该是'2 John 1990 B`@StevenSan,在这种情况下,您可以co-grp=>grp.OrderByx=>x.C3.first
using System;
using System.Linq;
using System.Collections.Generic;
...
var result = await data.GroupBy(d => new { d.C1, d.C2 }) //Group by C1 and C2
.Select(s => s.First()) //Select first record from each Group
.Skip(1) //Skip first record
.Take(4) //Pick up next 4 records
.ToListAsync() //Convert 4 records to List.