C# NET编译器如何为哈希集中的任何T构造O(1)查找<;T>;?

C# NET编译器如何为哈希集中的任何T构造O(1)查找<;T>;?,c#,.net,data-structures,C#,.net,Data Structures,我不明白一个编译器怎么会聪明到可以为MyObject构造一个O(1)查找,在那里我可以把任何东西都放进去 public class MyObject { // ... } 我了解如何对有限数量的非原语(如 public class MyObject { int i { get; set; } char c { get; set; } } 但是它怎么可能知道如何为MyObject的任何实现执行此操作呢?每个对象都有一个与之关联的对象。有一个方法(在基本对象类中定义为v

我不明白一个编译器怎么会聪明到可以为
MyObject
构造一个O(1)查找,在那里我可以把任何东西都放进去

public class MyObject
{
    // ... 
}
我了解如何对有限数量的非原语(如

public class MyObject
{
    int i { get; set; }
    char c { get; set; }
}
但是它怎么可能知道如何为
MyObject
的任何实现执行此操作呢?

每个对象都有一个与之关联的对象。有一个方法(在基本
对象
类中定义为virtual)必须在类中重写,以便
HashSet
可以正常工作

散列码是用于插入和标识的数值 基于哈希的集合中的对象,例如 字典类、哈希表类或派生的类型 来自DictionaryBase类。GetHashCode方法提供了以下功能 需要快速检查对象相等性的算法的哈希代码

对于当前类,它将无法正常工作(因为未重写
GetHashCode
)。将根据参考值而不是实际值进行相等性比较

  • 获取哈希代码
  • 将其向下模化以生成数组中的索引
  • 看那边。如果有一个项目,看看它是否相等
  • 到目前为止,完全是O(1)。如果许多项最终具有向下模化为同一索引的散列码,则会下降。这种情况的发生是可以预料和处理的,但是如果这种情况一直发生,那么最终会导致O(n)行为(以及非常糟糕的固定成本)


    默认情况下,所有对象都有一个基于引用标识的
    GetHashCode()
    和一个
    Equals()
    (即,它们仅与自身相等)。覆盖这些更改会改变它的相等概念,因此在更改
    Equals()
    时必须始终更改
    GetHashCode()
    (所有相等的对象都必须具有相等的哈希代码)。您还可以通过使用
    IEqualityComparer
    实现强制使用不同的相等概念,该实现提供了不同的
    GetHashCode()
    Equals()
    来使用。

    通过将对象转换为数字来实现。然后作为集合中的索引。Google“hash function”并阅读您最喜欢的关于Object.GetHashCode()的C#语言书籍。我认为这还不足以将其标记为重复,但我将深入解释字典(和HashSet)如何使用哈希代码来获取O(1)lookups Protip:如果你创建了一个
    结构,所有这些都是免费的:DNo你不知道如何为有限数量的非原语创建。您将使用MyObject获得0(1)个查找。问题是两个具有相同i can c的MyObject将不相等。它们将是HashSet中的两个条目。它将与它们的类一起工作,只是与默认的基于身份的类型相等。啊,好的。“必须被推翻”是我不知道的。我假设从
    对象
    继承的所有东西都已经有了一个公式,有一些公式足够通用,可以用于扩展
    对象
    @JonHanna的任何东西,是的,它将基于引用相等,而不是实际值。