我使用字典存储ID,otherID和bool值。不幸的是它比较了数组引用,因此我无法使用它。 有没有办法如何将数组作为键,但比较其值而不是引用? 感谢
答案 0 :(得分:9)
您可以使用字典的Comparer property将其设置为由您创建的自定义比较器。
编辑:实际上该属性是只读的,抱歉。你应该使用正确的构造函数:
class IntArrayComparer : IEqualityComparer<int[]> {
public bool Equals(int[] x, int[] y) {
if (x.Length != y.Length) {
return false;
}
for (int i = 0; i < x.Length; ++i) {
if (x[i] != y[i]) {
return false;
}
}
return true;
}
public int GetHashCode(int[] obj) {
int ret = 0;
for (int i = 0; i < obj.Length; ++i) {
ret ^= obj[i].GetHashCode();
}
return ret;
}
}
static void Main(string[] args) {
Dictionary<int[], bool> dict = new Dictionary<int[], bool>(new IntArrayComparer());
}
答案 1 :(得分:4)
您可以尝试实施IEqualityComparer<int[]>,然后将其实例传递给proper constructor。
答案 2 :(得分:3)
基本上有两种方法:
IEqualityComparable<int[]>
的比较器,将其传递给字典的构造函数。IEquatable<T>
。答案 3 :(得分:1)
orsogufo的答案没有错,但是我想指出,如果你有.NET 3.5,你可以用更少的代码实现ArrayValueComparer,同时使它成为通用的,这样它就可以比较这些值任何类型的数组,而不仅仅是整数数组。就此而言,您可以轻松地使其适用于任何IEnumerable,而不仅仅是数组。
using System.Collections.Generic;
using System.Linq;
class ArrayValueComparer<T> : IEqualityComparer<T[]>
{
public bool Equals(T[] x, T[] y)
{
return x.SequenceEqual(y, EqualityComparer<T>.Default);
}
public int GetHashCode(T[] obj)
{
return obj.Aggregate(0, (total, next) => total ^ next.GetHashCode());
}
}
static void Main(string[] args)
{
var dict = new Dictionary<int[], bool>(new ArrayValueComparer<int>());
}