我想检查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}];

10-08 14:07