c# - Linq distinct 和 max:如何去除重复项
问题描述
我有以下列表:
var items = new List<Tuple<string, int, int>>()
{
Tuple.Create("A", 3, 0),
Tuple.Create("A", 5, 0),
Tuple.Create("B", 1, 0),
Tuple.Create("C", 1, 0),
Tuple.Create("C", 3, 0),
Tuple.Create("C", 2, 0),
Tuple.Create("C", 3, 1)
};
我有以下 linq:
var results = (from item in items
group item by item.Item1 into groupedItems
let maxPriority = groupedItems.Max(item => item.Item2)
from element in groupedItems
where element.Item2 == maxPriority
select element).Distinct();
我得到这个:
Name Priority
A 5
B 1
C 3
C 3
我只想区分如下:
Name Priority
A 5
B 1
C 3
有谁知道如何修改linq来做到这一点?先谢谢你了。
注意:我知道 Distinct 具有允许您传递 IComparer 的重载。但是,如果可以在 linq 语句本身上更简单地完成,我想避免这种情况。我也没有坚持使用 Distinct 语句。
解决方案
从根本上说,您尝试执行的操作是从具有特定选择器函数最大值的序列中获取项目。因此,只需编写该函数(或使用其他人编写的函数)即可。请注意,在您的查询中,您将多次迭代序列以完成此操作,并且您可以做得更好。您只需要一次通过即可实现该操作。
现在您所做的只是对分组项目执行单个操作,您的查询变得非常简单:
var query = items.GroupBy(item => item.Item1)
.Select(group => group.MaxBy(item => item.Item2));
推荐阅读
- python - Sklearn 随机森林在预测上比训练花费更多的时间
- c# - 如何登录用户对持久层的声明(洋葱架构)
- node.js - 前端 API 调用接收 403 错误状态
- flutter - Flutter 在尝试查找包时遇到套接字错误
- java - Difference between Java bytecode and Kotlin bytecode
- vue.js - 如何使用自定义图标在 vuetify 数据表上运行排序箭头功能?
- javascript - 节点js document.getElementById中的tensorflow-models/posenet null
- javascript - ref 上的事件处理程序如何在渲染之间持续存在?
- cryptography - 如何划分属于 GT 组 pbc 的 2 个元素
- ssh - 如何使用 jenkinsfile 和参数化构建从远程 ssh 获取失败命令的退出代码