【问题标题】:Dictionary with integer array as a key以整数数组为键的字典
【发布时间】:2010-08-01 19:59:29
【问题描述】:

我需要一个字典,其键是整数数组,例如 Dictionary<int[],string>

Dictionary<List<int>,string>.

但我很惊讶 Equality 方法和 hash code 方法没有为我定义。除了创建我自己的MyType: List&lt;int&gt; 并定义所有必要的方法之外,还有什么简单的方法可以实现这样的结构吗?

【问题讨论】:

    标签: c# collections dictionary


    【解决方案1】:

    您可以在某处提供两种方法,而不是创建自己的类型

    string ConvertListToString(List<int> l){...};
    List<int> ConvertStringToList(string s){...};
    

    改用Dictionary&lt;string,string&gt;

    【讨论】:

      【解决方案2】:

      它不是预定义的,因为它昂贵。如果您知道您的列表很短,那么只需实现明显的覆盖。如果没有,您将不得不为至少 GetHashCode 想出某种启发式方法。比如说,只有前几个元素的 GetHashCode 与 Length 异或。

      【讨论】:

      • 我认为启发式应该包括长度(大量)。其余部分取决于域,对列表进行抽样可能比仅使用第一个元素更好。
      • 排序列表的哈希值是否与未排序的列表不同?这里有很多理由不提供默认实现(编辑:并对容器内容做出假设)而不是纯粹的费用。
      • @Marc,对,这就是我提到问题域的原因。这里没有通用的解决方案。在某些(罕见的)情况下,甚至 Length 属性也可能无关紧要。
      【解决方案3】:

      GetHashCode 和 Equality 是为 List 定义的,它们只是不会被覆盖以提供您可能期望的行为。

      如果您使用的是 .NET 3.5,您可以为 List 编写扩展方法,实现对 GetHashCode()Equality() 的覆盖

      【讨论】:

      • 但是Dictionary&lt;,&gt; 方法会使用那些扩展方法吗?
      猜你喜欢
      • 2017-04-25
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多