字典<int [], bool> - 比较数组中的值,而不是引用?

7

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


1
字典?真的吗?哈哈。 - abelenky
4个回答

10
你可以使用字典的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());
}

4

3

基本上有两种方法可以做到这一点:

  • 创建一个实现IEqualityComparable<int[]>的比较器,并将其传递给字典的构造函数。
  • 创建一个封装整数数组并实现IEquatable<T>的键类。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接