c# - 如何使用项目的哈希值检查 HashSet 是否包含项目?

标签 c# hash hashcode hashset

我想检查 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/

相关文章:

java - Java HashMap 如何处理具有相同哈希码的不同对象?

c# - 选择两个列表中常见的元素哪个更有效?

c# - 如何使用 LLBLGen 连接具有条件的表?

android - 比较在 Android 中使用 SHA-1 生成的两个哈希字符串

Java - 如何撤消 hashCode() 并读取为字符串?

Java:将重复的对象添加到集合中?

c# - 如何将 Visual Studio Text Visualizer 用于自定义类型?

c# - 如果元素来自 ItemSsource,如何在 WPF TreeView 中聚焦元素?

javascript - jsSHA512 来自同一字符串的不同哈希值

ruby - 使用数组中的键访问散列