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

C#如何基于自定义IsDuplicate函数去重并保留p1值更高的元素

解决方案

要实现按「p2的和相等即为重复」的自定义规则去重,且重复时保留p1值最高的元素,用LINQ的GroupBy是最合适的办法——不用对整个列表排序,只需要在每组内部筛选目标元素就行。

关键思路

  1. 分组:把p2.Sum()作为分组依据,所有p2和相等的元素会被分到同一组(也就是你定义的重复项)。
  2. 选每组里的最优元素:在每个分组里直接找出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:35:15