【问题标题】:Whether a Dictionary can have Array as Key?字典是否可以将数组作为键?
【发布时间】:2014-04-14 18:05:13
【问题描述】:

我在字典中遇到问题。 数组是否可以是值的键???

Dictionary<string[], int> di = new Dictionary<string[], int>();
di.Add(new string[]
{
    "1","2"
}, 1);

di.Add(new string[]
{
    "2","3"
}, 2);

MessageBox.Show(di[new string[] { "2", "3" }].ToString()); // Here KeyNotFoundException occurred.

为什么要例外?

【问题讨论】:

  • 问题是每个数组根据其GetHashCode() 被认为是不同的,即使它们包含相同的值。

标签: c# dictionary


【解决方案1】:

默认情况下只会比较数组的引用,所以你要么必须

  1. 提供自定义IEqualityComparer&lt;string[]&gt;
  2. 改用Tuple&lt;string, string&gt; 作为键(因为您只有两个字符串)

Here's 一个类似问题的答案,显示如何为Dictionary- constructor 创建自定义比较器。

【讨论】:

  • 因此我需要动态创建一个包含 N 个键的多键字典.. 我尝试了一个简单的.. 你的回答给了我一个方法.. :-)
  • @GokulJai:我不确定你是否正确理解了我。 Tuple 只是您的阵列的替代品,因为无论如何您只使用两个字符串。 Tuple 会自动为您覆盖 Equals + GetHashCode。如果你想使用数组,你需要提供一个自定义类来实现你在字典的构造函数中使用的IEqualityComparer&lt;string&gt;
  • 是的,我明白这一点。我的Key 数组可以包含一个或多个元素。但我应该使用自定义比较器。 @TimSchmelter 谢谢。
  • @GokulJai:请注意,我已经编辑了我的答案,因为我之前的编辑使它不正确。现在是 IEqualityComparer&lt;string[]&gt; 而不是 IEqualityComparer&lt;string&gt;
【解决方案2】:

不,实际上您不应该将数组用作Dictionary&lt;&gt; 键; Dictionary&lt;&gt; 当使用 keys 时使用它们的 散列码,它们被计算为 地址

String[] a = new[]{"1", "2"}; 
String[] b = new[]{"1", "2"}; 

a.GetHashCode() == b.GetHashCode(); // <- false

数组 a 和 b 有不同的地址,所以 不同的哈希码这就是原因

di.Add(a, 1); 
di[b]; // <- error since a.GetHashCode() != b.GetHashCode() 

【讨论】:

    【解决方案3】:

    因为数组的Equals和GetHashCode函数不比较内容,而是比较数组本身的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-30
      • 2019-10-05
      • 1970-01-01
      • 2016-09-24
      • 2013-10-14
      • 2017-04-27
      • 2017-05-06
      • 1970-01-01
      相关资源
      最近更新 更多