Dictionary <int [],=“”bool =“”> - 比较数组中的值,而不是引用?</int>

时间:2010-01-07 08:15:38

标签: c# arrays dictionary

我使用字典存储ID,otherID和bool值。不幸的是它比较了数组引用,因此我无法使用它。 有没有办法如何将数组作为键,但比较其值而不是引用? 感谢

4 个答案:

答案 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>());
}