我有一个这样的简单字典:
Dictionary<string[], object[]> list = new Dictionary<string[], object[]>();
Run Code Online (Sandbox Code Playgroud)
我添加项目:
list.Add(new string[] {"a", "a", "a"}, new object[]{ });
Run Code Online (Sandbox Code Playgroud)
当我尝试按键获取值时出现问题
object[] values;
if(list.TryGetValue(new string[] {"a", "a", "a"}, out values)
{ }
Run Code Online (Sandbox Code Playgroud)
总是返回null.似乎他在字典中找不到这个键但是你可以看到有......
感谢帮助
如前所述,每个阵列确实是不同的对象.默认情况下,使用对象引用比较数组,而不考虑数组的实际内容.您可以通过实现自己的数组比较器来解决这个问题,如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
它使用内置的Array功能(Array实现IStructuralEquatable)来提供与数组元素相关的相等和哈希码操作.然后你做:
Dictionary<string[], object[]> list = new Dictionary<string[], object[]>(new ArrayComparer<string>());
Run Code Online (Sandbox Code Playgroud)
即使您传递不同的实例或数组,它也会工作.你是否应该有一个字典,其中键是数组是一个不同的故事....