如何实现自己的HashSet包含方法

时间:2013-02-10 15:14:31

标签: c#

我有HahSet int [9]数组的集合,并想知道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?

3 个答案:

答案 0 :(得分: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());

答案 1 :(得分:4)

哈希集类有a constructor that takes an equality comparer。使用它。

答案 2 :(得分:2)

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

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

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