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

在C#中使用IEqualityComparer基于两个属性生成去重列表

基于双属性实现ListBox项的正确去重

我来帮你搞定这个双属性去重的问题~核心就是要让Distinct()方法明白:当两个FamilySelector对象的目标属性(这里是CodeFamily和Family)完全匹配时,才算重复项。默认的Distinct()只看对象引用(如果FamilySelector是类的话),所以必须传入自定义的相等比较器来实现规则。

步骤1:确保你的IEqualityComparer实现正确

先检查你写的IEqualityComparer<FamilySelector>类,它的Equals和GetHashCode方法必须严格绑定你要去重的两个属性。如果还没写好,参考下面的实现:

public class FamilySelectorEqualityComparer : IEqualityComparer<FamilySelector>
{
    public bool Equals(FamilySelector x, FamilySelector y)
    {
        // 处理null边界情况,避免空引用异常
        if (ReferenceEquals(x, y)) return true;
        if (x is null || y is null) return false;
        
        // 比较两个关键属性:这里假设是CodeFamily和Family,根据你的类结构调整
        // 要不要忽略大小写?根据业务需求修改StringComparison参数即可
        return string.Equals(x.CodeFamily, y.CodeFamily, StringComparison.OrdinalIgnoreCase)
               && string.Equals(x.Family, y.Family, StringComparison.OrdinalIgnoreCase);
    }

    public int GetHashCode(FamilySelector obj)
    {
        if (obj is null) return 0;
        
        // 结合两个属性的哈希值,减少哈希碰撞概率
        var hash1 = obj.CodeFamily?.GetHashCode() ?? 0;
        var hash2 = obj.Family?.GetHashCode() ?? 0;
        
        return hash1 ^ (hash2 << 1);
    }
}

步骤2:在Distinct()中传入自定义比较器

修改你的PopulateFamily方法,在调用Distinct时传入上面的比较器实例,这样Distinct就会按照你定义的规则去重:

private void PopulateFamily() 
{ 
    var source = _mfgOrdersData 
        .Select(o => new FamilySelector(o.ItemWrapper.ItemClass, o.ItemWrapper.Family)) 
        // 关键:传入自定义比较器
        .Distinct(new FamilySelectorEqualityComparer())
        .OrderBy(f => f.CodeFamily) 
        .ToList(); 

    FamilyFilterListBox.DataSource = source; 
    FamilyFilterListBox.ValueMember = "Family"; 
    FamilyFilterListBox.DisplayMember = "CodeFamily"; // 补全你原来的DisplayMember,应该是这个吧
}

几个关键注意点

  • 如果FamilySelector是引用类型(class),必须用自定义比较器,否则Distinct会把属性相同但引用不同的对象当成不同项;如果是值类型(struct),默认的相等比较是值相等,但自定义比较器依然能更灵活地控制规则。
  • GetHashCode方法必须和Equals方法逻辑一致:如果两个对象Equals返回true,它们的GetHashCode必须相等,这样Distinct才能高效分组去重。
  • 字符串比较的大小写规则要贴合你的业务场景,比如产品分类名称是否区分大小写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:58:37