【问题标题】:Dictionary<string[], object[]> c# TryGetValue always return nullDictionary<string[], object[]> c# TryGetValue 总是返回 null
【发布时间】:2016-11-04 12:18:29
【问题描述】:

我有一个像这样的简单字典:

Dictionary<string[], object[]> list = new Dictionary<string[], object[]>();

我添加项目:

list.Add(new string[] {"a", "a", "a"}, new object[]{ });

当我尝试按键获取值时出现问题

object[] values;   
if(list.TryGetValue(new string[] {"a", "a", "a"}, out values)
{  }

总是返回空值。似乎他在字典中找不到这个键,但你可以看到...

感谢您的帮助

【问题讨论】:

  • 我认为您需要一个使用 SequenceEquals 的自定义比较器
  • 当我看到这样的“简单字典”时,首先想到的总是这里的设计有问题。你确定这是必要的吗?也许我们可以帮助重新设计?参考差异已经在 cmets 和下面的答案中进行了解释,所以我什至不会打扰。
  • 我已经简化了结构来解释和解决我的问题。我正在编写一个应用程序,该应用程序根据仓库中物品的移动进行购买预测,并提供一种工具来将来自不同来源的更多数据在一个名为“key”的相同列的帮助下合并

标签: c# dictionary


【解决方案1】:

正如已经回答的那样,每个数组确实是不同的对象。默认情况下,使用对象引用比较数组,而不考虑数组的实际内容。您可以通过实现自己的数组比较器来解决此问题,如下所示:

class ArrayComparer<T> : IEqualityComparer<T[]> {
    public bool Equals(T[] x, T[] y) {
        return ((IStructuralEquatable) x).Equals((IStructuralEquatable) y, EqualityComparer<T>.Default);
    }

    public int GetHashCode(T[] obj) {
        return ((IStructuralEquatable) obj).GetHashCode(EqualityComparer<T>.Default);
    }
}

它使用内置的 Array 功能(Array 实现 IStructuralEquatable)来提供尊重数组元素的相等和哈希码操作。然后你做:

Dictionary<string[], object[]> list = new Dictionary<string[], object[]>(new ArrayComparer<string>());

即使您传递不同的实例或数组,它也会起作用。你是否应该有一个键是数组的字典是另一回事....

【讨论】:

  • 谢谢它很好用,但是如果我尝试在数组中找到一个包含字符'/'的字符串的键,它会返回 null。
【解决方案2】:

您创建的每个数组都是一个不同的对象,因此只能使用您用作键的相同数组来查找它。另一个具有相同值的数组不会是同一个数组。

如果值的数量是固定的,您可以使用Tuple&lt;string, string, string&gt; 作为键。

如果它是变量,您可以定义自定义IEqualityComparer。查看this question 了解如何操作。

【讨论】:

  • 键数组中没有字符串不固定,它会根据用户输入而变化
  • 或者您可以实现自己的相等比较器。
【解决方案3】:

获取参考: var key = new string[] {"a", "a", "a"};

 Dictionary<string[], object[]> list = new Dictionary<string[], object[]>();
 var key = new string[] { "a", "a", "a" };
 list.Add(key, new object[] { });
 object[] values;   

 if(list.TryGetValue(key, out values))
 {

 }

【讨论】:

  • 这里的问题是,如果您从数据库或文件中读取数组值,您最终会创建一个新对象并且不能使用现有的“相等”引用。
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 2012-10-13
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
相关资源
最近更新 更多