如何在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
相关产品推荐
相关产品推荐

