C#如何基于自定义IsDuplicate函数去重并保留p1值更高的元素
解决方案
要实现按「p2的和相等即为重复」的自定义规则去重,且重复时保留p1值最高的元素,用LINQ的GroupBy是最合适的办法——不用对整个列表排序,只需要在每组内部筛选目标元素就行。
关键思路
- 分组:把
p2.Sum()作为分组依据,所有p2和相等的元素会被分到同一组(也就是你定义的重复项)。 - 选每组里的最优元素:在每个分组里直接找出p1最大的元素,用
Aggregate遍历就能做到,完全不用排序。
修改后的代码
class A { public int p1; public List<int> p2; public bool IsDuplicate(A other) => p2.Sum() == other.p2.Sum(); public List<A> GetDistinctA(List<A> objects) { return objects // 按p2的和分组,完全对应你IsDuplicate的判断逻辑 .GroupBy(a => a.p2.Sum()) // 遍历每组,始终保留当前p1最大的元素 .Select(group => group.Aggregate((currentMax, next) => next.p1 > currentMax.p1 ? next : currentMax)) .ToList(); } }
代码解释
- GroupBy分组逻辑:
GroupBy(a => a.p2.Sum())和你写的IsDuplicate判断完全一致——两个元素满足IsDuplicate,本质就是它们的p2和相等,这样分组后每组就是一组重复元素。 - Aggregate找最大值:
Aggregate会逐个遍历分组里的元素,每次对比后留下p1更大的那个,比排序后取第一个的方式更高效,也符合你“不想用排序”的要求。 - 最终结果:把每组筛选出来的p1最大元素收集成列表,就是去重后的结果。
为什么不用Distinct?
Distinct只会保留序列里第一个出现的不重复元素,没法自定义选择要保留哪个(比如p1更高的)。哪怕你写自定义的IEqualityComparer<A>来判断重复,也解决不了“选p1最大元素”的问题,所以GroupBy才是更适配的方案。
内容的提问来源于stack exchange,提问作者user1981275
相关产品推荐
相关产品推荐

