【问题标题】:C# List as Dictionary keyC# 列表作为字典键
【发布时间】:2012-04-18 17:12:47
【问题描述】:

我有一本由列表键入的字典:

private Dictionary<List<custom_obj>, string> Lookup;

我正在尝试使用 ContainsKey,但它似乎不起作用,我不知道为什么。 这是来自我的 Visual Studio 即时窗口的调试信息:

?Lookup.Keys.ElementAt(7)[0]
{custom_obj}
    Direction: Down
    SID: 2540
?Lookup.Keys.ElementAt(7)[1]
{custom_obj}
    Direction: Down
    SID: 2550
searchObject[0]
{custom_obj}
    Direction: Down
    SID: 2540
searchObject[1]
{custom_obj}
    Direction: Down
    SID: 2550
?Lookup.ContainsKey(searchObject)
false

按照我的常识,最后一个 ContainsKey 应该是真的。希望我在这里提供了足够的信息……有什么想法吗?

谢谢!

【问题讨论】:

    标签: c# list dictionary containskey


    【解决方案1】:

    List&lt;custom_obj&gt; 实例作为键在引用上不等于 searchObject 引用的实例。

    如果您希望字典使用列表中的值而不是引用相等来查找匹配的键,则必须在字典的 constructor 中提供 IEqualityComparer(因为您无法覆盖 @987654323 中的 Equals 和 GetHashCode @)。

    【讨论】:

      【解决方案2】:

      您有两个独立的Lists,它们包含相同的元素。判断两个列表是否相等的正确方法是使用SequenceEqual 方法。

      默认情况下你不能做你想做的事。但是,您可以编写自定义 IEqualityComparer 并将其传递给 Dictionary 构造函数。

      这是一个通用示例IEqualityComparer

      class ListComparer<T> : IEqualityComparer<List<T>>
      {
          public bool Equals(List<T> x, List<T> y)
          {
              return x.SequenceEqual(y);
          }
      
          public int GetHashCode(List<T> obj)
          {
              int hashcode = 0;
              foreach (T t in obj)
              {
                  hashcode ^= t.GetHashCode();
              }
              return hashcode;
          }
      }
      

      您可能希望改进 GetHashCode 的实现,因为这是一个快速而简单的解决方案。

      【讨论】:

      • GetHashCode 缺少返回值。
      • 快速说明:正如答案所暗示的,您不应使用此比较器。 equals 方法对 order 敏感,hash 方法不敏感。
      • 您可以使用StructuralComparisons 类(从.NET 4.0 和Visual Studio 2010 开始),请参阅this answer
      • 从 .NET Core 2.1 或 .NET Framework 4.6.1 开始,可以使用System.HashCode,这可能比实现自己的哈希更好。见this answer
      【解决方案3】:

      这仅在查找中使用的实际列表实例与作为键添加的实例相同时才有效。它不会比较列表内容。如果您尝试直接比较两个 List 对象,这与您将得到的行为相同。

      【讨论】:

        【解决方案4】:

        您确定您在查找方法中使用的实例与您的字典键中的实例相同吗?这是我唯一能想到的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-30
          • 2020-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-09
          相关资源
          最近更新 更多