【问题标题】:How to make objects with same data have same key? [duplicate]如何使具有相同数据的对象具有相同的键? [复制]
【发布时间】:2013-05-12 23:41:46
【问题描述】:

有没有一种简单的方法可以根据类的数据为类创建哈希键??? 或者一些接口?

我有一个Dictionary<MyClass, int>。

MyClass 很简单,它包含一个名称和一个字符串数组:

class MyClass
{
    public string Name {get; private set;}
    public string[] Attributes {get; private set; }

    //and a constructor and some methods
}

现在,如果我有两个包含相同名称和属性的 MyClass 实例,我需要该字典来考虑它们是否具有相同的键。

我试着把它做成一个结构,也试着做成一个Dictionary<string[], int>,但是这三种情况都是一样的,字典对每个实例都看到不同的键,即使有相同的数据。

我可以创建一个带有名称和所有参数的算法的字符串键,并创建一个Dictionary<string, int>,但我想要更自动化的东西。还有其他方法吗? 也许是一个接口(不会避免算法,但总比没有好)。

【问题讨论】:

标签: c# dictionary key


【解决方案1】:

您需要覆盖 Equals() 和 GetHashCode() 以按值比较实例。

【讨论】:

  • 很好....但是....创建int 哈希会很糟糕。有这么多的字符串,它很可能是不够的。 Equals() 是否足以让字典将它们识别为相同?
  • @Daniel:不。字典的全部意义在于使用哈希码为每个对象创建索引。 (阅读维基百科上的哈希表)
  • 对,但是,32 个字符的字符串肯定比 32 位 int 有更多的组合。字典如何使用 int32 哈希码来处理?
  • @Daniel 哈希值不是唯一的。它们旨在尽可能避免重复值(与其他因素相平衡,例如生成速度),但它们仍然会发生。查找“哈希冲突”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多