使用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
相关产品推荐
相关产品推荐

