如何使用Linq获取每个组中的第一条记录

erhoui1w  于 2023-07-31  发布在  其他
关注(0)|答案(7)|浏览(201)

考虑以下记录:

Id          F1            F2             F3 
 -------------------------------------------------
   1           Nima          1990           10
   2           Nima          1990           11
   3           Nima          2000           12
   4           John          2001           1
   5           John          2002           2 
   6           Sara          2010           4

字符串
我想根据F1字段进行分组,并按Id进行排序,然后从组的第一条记录中获取与以下记录类似的所有字段:

Id          F1            F2             F3 
 -------------------------------------------------
   1           Nima          1990           10
   4           John          2001           1
   6           Sara          2010           4


我如何使用linq做到这一点?

vfh0ocws

vfh0ocws1#

var result = input.GroupBy(x => x.F1, (key,g) => g.OrderBy(e => e.F2).First());

字符串

ogq8wdun

ogq8wdun2#

var res = from element in list
          group element by element.F1
              into groups
              select groups.OrderBy(p => p.F2).First();

字符串

q5iwbnjs

q5iwbnjs3#

@Alireza的awnser是完全正确的,但是你必须注意到,在使用这段代码的时候

var res = from element in list
          group element by element.F1
              into groups
              select groups.OrderBy(p => p.F2).First();

字符串
这与此代码类似,因为您对列表进行排序,然后进行分组,因此您将获得组的第一行

var res = (from element in list)
          .OrderBy(x => x.F2)
          .GroupBy(x => x.F1)
          .Select()


现在,如果你想做一些更复杂的事情,比如采取相同的分组结果,但采取F2的第一个元素和F3的最后一个元素,或者更自定义的东西,你可以通过研究下面的代码来做到这一点

var res = (from element in list)
          .GroupBy(x => x.F1)
          .Select(y => new
           {
             F1 = y.FirstOrDefault().F1;
             F2 = y.First().F2;
             F3 = y.Last().F3;
           });


所以你会得到这样的结果

F1            F2             F3 
 -----------------------------------
   Nima          1990           12
   John          2001           2
   Sara          2010           4

n3h0vuf2

n3h0vuf24#

用它来实现你想要的。然后决定要返回哪些属性。

yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)

字符串

1l5u6lss

1l5u6lss5#

另一种方式:

var result = input.GroupBy(i => i.F1).Select(g => g.First());

字符串
您可以按多个字段分组:

var result = input.GroupBy(i => new {i.F1, i.F2}).Select(g => g.First());


如果你需要保持秩序,那么使用lookup:

var result = input.ToLookup(i => i.F1).Select(g => g.First());

txu3uszq

txu3uszq6#

var res = (from element in list)
      .OrderBy(x => x.F2).AsEnumerable()
      .GroupBy(x => x.F1)
      .Select()

字符串
在OrderBy()之后使用.AsEnumerable()

llycmphe

llycmphe7#

这并不是你要找的东西,但有时我们会找错东西,因为我们不知道存在什么。所以我的解决方案是最直观的:

var dict = 
input.OrderByDescending(x => x.Id)
     .GroupBy(x => x.F1)
     .ToDictionary(x => x.Key, x => new { x.First().F1, x.First().F2, x.First().F3});

字符串
先点单,然后分组-直接前进。现在,结果将是一个键类型对的列表。由于我们的表已经排序,我们可以只选择第一个条目。另外,我建议将结果放入一个字典中,ID作为访问器,这是一个非常快速的数据结构访问,仍然灵活。现在您可以使用

dict[4].F1 // returns John


技术上它的IEnumerable<IBGrouping <int,yourType>>

相关问题