Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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# C linq lambda表达式按多列分组,并获取组的第一项_C#_Linq_Group By - Fatal编程技术网

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.