You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LINQ中分组后按自定义优先级选取组内首个对象

实现自定义优先级的分组对象选取需求

你这个需求很常见,我们可以用两种简洁的LINQ写法来实现,完全贴合你的优先级规则:

方法一:通过优先级权重排序(代码简洁直观)

这种方法给每个目标type分配一个优先级分数,排序后取最高优先级的对象:

var result = myList
    .GroupBy(x => x.id) // 第一步:按id分组,和你原来的逻辑一致
    .Select(group => 
        // 按自定义优先级降序排序,优先级高的排前面
        group.OrderByDescending(item => item.type switch 
        {
            27 => 3,  // 最高优先级:type=27
            14 => 2,  // 次高:type=14
            50 => 1,  // 再次:type=50
            _ => 0     // 其他类型最低优先级
        })
        .FirstOrDefault()); // 取排序后的第一个对象,就是优先级最高的

方法二:依次按优先级查找(性能更优)

如果你的分组数据量比较大,这种方法会更高效——它不需要排序,而是按优先级顺序依次查找,找到第一个匹配项就停止:

var result = myList
    .GroupBy(x => x.id)
    .Select(group => 
        // 按优先级顺序依次查找,找到就返回,否则继续下一个
        group.FirstOrDefault(item => item.type == 27) ??
        group.FirstOrDefault(item => item.type == 14) ??
        group.FirstOrDefault(item => item.type == 50) ??
        group.FirstOrDefault()); // 所有优先级都没匹配,返回组内任意一个

两种方法的对比

  • 方法一代码更简洁,逻辑一目了然,适合数据量不大的场景;
  • 方法二避免了排序操作(排序是O(n log n)复杂度),每组最多只需要遍历到第一个匹配项,大数据量下性能更好。

两种写法都完美符合你的需求:先按id分组,然后严格按照27→14→50→任意的优先级选取对象。

内容的提问来源于stack exchange,提问作者USER_8675309

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:49:42