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

使用HashCode.Combine<>处理集合参数时Distinct方法失效问题

问题分析

Distinct方法的工作逻辑是先通过哈希码对对象分组,再调用Equals判断组内对象是否相等。你的ClaimPath类中,GetHashCode用HashCode.Combine(Identifiers)计算哈希值的问题在于:该方法传入的是集合实例本身,而集合的哈希码是基于对象引用而非内部元素序列生成的——哪怕两个集合的元素完全一致,只要是不同实例,哈希码就会不同,导致Distinct将它们判定为不同对象,无法完成去重。

正确实现方案

需要基于集合内的元素序列来计算哈希码,而非集合实例的引用。可以通过遍历元素逐个合并哈希值的方式实现:

public override int GetHashCode()
{
    var hashCode = new HashCode();
    foreach (var identifier in Identifiers)
    {
        hashCode.Add(identifier);
    }
    return hashCode.ToHashCode();
}

如果Identifiers的元素类型是已知的(比如字符串),也可以用传统的哈希计算方式:

public override int GetHashCode()
{
    int hash = 17;
    foreach (var id in Identifiers)
    {
        hash = hash * 31 + (id?.GetHashCode() ?? 0);
    }
    return hash;
}
验证逻辑

修改后,只要两个ClaimPath实例的Identifiers元素序列完全相同,它们的哈希码就会一致。Distinct方法会先通过哈希码分组,再调用你实现的Equals方法确认相等性,从而正确完成去重。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:54:51