我正在使用字典来存储ID、otherID和bool值。不幸的是,它比较的是数组引用,因此我无法使用它。 有没有办法将一个数组作为键,但比较其值而不是引用? 谢谢
我正在使用字典来存储ID、otherID和bool值。不幸的是,它比较的是数组引用,因此我无法使用它。 有没有办法将一个数组作为键,但比较其值而不是引用? 谢谢
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());
}
基本上有两种方法可以做到这一点:
IEqualityComparable<int[]>
的比较器,并将其传递给字典的构造函数。IEquatable<T>
的键类。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>());
}