如何使用 Linq 获取每个分组中的第一个元素?

咨询区

  • Arian

考虑下面的记录:

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 来实现?

回答区

  • Rubens Mussi Cury

可以有三种实现方式。

  1. 扩展方法实现

这种实现非常简单,参考如下代码:

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());
  1. 关键词实现

可以借用 from ... in ... group ... by ... into ... select 模式,参考如下代码:

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

混合实现的话,可以先 OrderBy 再 GroupBy ,参考如下代码:

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

点评区

其中从每个分组中提取第一项的需求在实际业务开发中还是蛮多的,Rubens Mussi Cury 大佬用了三种方法做了实现,学习了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值