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
)。将根据参考值而不是实际值进行相等性比较
默认情况下,所有对象都有一个基于引用标识的
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的任何东西,是的,它将基于引用相等,而不是实际值。