如何实现自己的HashSet contains方法

4

我有一个由int [9]数组组成的Hashset集合,想知道该集合是否已经包含了这个数组。例如:

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

4

2

你需要实现自己的数组相等比较器,例如这里列出的这个

然后只需让哈希集使用你的比较器即可:

var set = new HashSet<int[]>(new ArrayEqualityComparer<int>());
...
    // You don't need to do a Contains check; it's implicit.
set.Add(someArray);

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