Dictionary <string [],object [] =“”> c#TryGetValue始终返回null

时间:2016-11-04 12:18:30

标签: c# dictionary

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

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)
{  }

始终返回null。似乎他无法在字典中找到这个键,但正如你所看到的那样......

感谢您的帮助

3 个答案:

答案 0 :(得分:6)

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

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>());

即使您传递不同的实例或数组也会有效。你是否应该有一个字典,其中键是数组是一个不同的故事....

答案 1 :(得分:1)

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

如果值的数量是固定的,您可以使用Tuple<string, string, string>作为密钥。

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

答案 2 :(得分:0)

获取参考:  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))
 {

 }