4

我有 int[9] 数组的 HahSet 集合,想知道 HashSe 是否已经包含该数组。例如

       HashSet<int[]> set = new HashSet<int[]>();
       int[] a=new int[9]{1,2,3,4,5,6,7,8,9};
       set.Add(a);
       int[] a2=new int[9]{1,2,3,4,5,6,7,8,9};
       if(!set.Contains(a2))
          set.Add(a2);

如何覆盖或实现自己的 Equals 方法,以便 HastSet.Contains 的行为类似于 Arrays.SequenceEquals?

4

3 回答 3

5

您需要提供 的实现IEqualityComparer<int[]>,并使用带有自定义比较器的构造函数:

class MyEqCmpForInt : IEqualityComparer<int[]> {
    public bool Equals(int[] a, int[] b) {
        ...
    }
    public int GetHashCode(int[] data) {
        ...
    }
}

HashSet<int[]> set = new HashSet<int[]>(new MyEqCmpForInt());
于 2013-02-10T15:17:29.567 回答
4

哈希集类有一个构造函数,它接受一个相等比较器。用它。

于 2013-02-10T15:17:13.143 回答
2

您必须实现自己的数组相等比较器,例如此处列出的比较器。

然后就像要求哈希集使用您的比较器一样简单:

var set = new HashSet<int[]>(new ArrayEqualityComparer<int>());
...
    // You don't need to do a Contains check; it's implicit.
set.Add(someArray);
于 2013-02-10T15:19:10.817 回答