我想检查 HashSet 是否包含特定元素。我已经有了元素的 int
哈希码,但没有对元素本身的引用。
是否可以在不遍历整个集合的情况下做到这一点?
最佳答案
不,因为
- 没有哈希码到对象的一对一映射 (pigeon principle)
- .Net
HashSet
/Dictionary
不要公开这个实现细节
如果你真的需要通过哈希码查找对象,你可以
- 遍历所有项目并比较哈希码
- 如果这是主要功能 - 考虑自定义比较器是否可以让您拥有与具有相同哈希码的任何其他对象匹配的特殊对象......
特殊比较器的大概代码
class ObjectsToStore
{
....
public int? HashCodeOverwrite;
}
class ComparerByHashCode : IEqualityComparer<ObjectsToStore>
{
public bool Equals(ObjectsToStore b1, ObjectsToStore b2)
{
if (b1.HashCodeOverwrite.HasValue || b2.HashCodeOverwrite.HasValue)
{
return b1.GetHashCode() == b2.GetHashCode());
}
// add all null checks here too.
return b1.Equals(b2);
}
public int GetHashCode(ObjectsToStore b)
{
return b.HashCodeOverwrite.HasValue? b.HashCodeOverwrite.Value:b.GetHashCode();
}
}
大概用法:
var myHashSet = new HashSet<ObjectsToStore>(new ComparerByHashCode());
var itemByHashCode = myHashSet[new ObjectsToStore{HasCodeOverwrite= 1234}];
关于c# - 如何使用项目的哈希值检查 HashSet 是否包含项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25232820/