c#int数组的hashsets结构比较

时间:2012-03-28 15:51:05

标签: c# collections

var comparer = ...
var s1 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } }, comparer);
var s2 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } }, comparer);

是否有(默认?)比较器我可以插入HashSet以使s1.Equals(s2)为真? 我知道有一个StructuralComparisons.StructuralEqualityComparer,但是HashSet需要一个通用的IEqualityComparer&lt;&gt;。

更新

看起来不会起作用。我得到的最接近的是使用HashSet.SetEquals并按照phoog的建议插入StructuralComparisons.StructuralEqualityComparer的包装器

    internal class GenericStructuralComparer<T> : IEqualityComparer<T>
    {
        static GenericStructuralComparer<T> _instance;

        public static IEqualityComparer<T> Instance
        {
            get { return _instance ?? (_instance = new GenericStructuralComparer<T>()); }
        }

        public bool Equals(T x, T y)
        {
            return StructuralComparisons.StructuralEqualityComparer.Equals(x, y);
        }

        public int GetHashCode(T obj)
        {
            return StructuralComparisons.StructuralEqualityComparer.GetHashCode(obj);
        }
    }

    public static IEqualityComparer<T> StructuralComparer<T>()
    {
        return GenericStructuralComparer<T>.Instance;
    }

然后

var comparer = StructuralComparer<int[]>();
var s1 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } }, comparer);
var s2 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } }, comparer);
s1.SetEquals(s2); // True

2 个答案:

答案 0 :(得分:2)

否 - 因为隐式数组相等性未定义超出参考质量;并且在运行时,数组不会提供将考虑内部元素的GetHashCode - 因为,正确地说,组合哈希码没有一般情况 - 因此框架不会尝试实现一个。

你必须自己动手。

答案 1 :(得分:0)

不,默认没有比较器,但你可以创建一个这样的扩展方法,它可以解决这个问题:

public static class HashSetExt
{
    public static bool HashSetEqualsTo<T>(this HashSet<T> set, HashSet<T> other)
    {
        return //Your own compare method
    }
}

class Program
{
    static void Main(string[] args)
    {
        var s1 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } });
        var s2 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } });
        var isEquals = s1.HashSetEqualsTo<int[]>(s2);
    }
}