int数组哈希集的c#结构比较 var比较程序=。。。 var s1=新的HashSet(new[]{new[]{1,2},new[]{3,4},comparer); var s2=新的HashSet(new[]{new[]{1,2},new[]{3,4},comparer);

int数组哈希集的c#结构比较 var比较程序=。。。 var s1=新的HashSet(new[]{new[]{1,2},new[]{3,4},comparer); var s2=新的HashSet(new[]{new[]{1,2},new[]{3,4},comparer);,c#,collections,C#,Collections,是否有一个(默认值?)比较器可以插入HashSet,以便s1.Equals(s2)为真? 我知道有一个StructuralCompares.StructuralEqualityComparer,但HashSet需要一个通用的IEqualityComparer 更新: 看起来根本不可能。我得到的最接近的方法是使用HashSet.SetEquals,并按照phoog的建议插入一个包装器,用于StructuralCompares.StructuralEqualityComparer var compa

是否有一个(默认值?)比较器可以插入HashSet,以便s1.Equals(s2)为真? 我知道有一个StructuralCompares.StructuralEqualityComparer,但HashSet需要一个通用的IEqualityComparer

更新:

看起来根本不可能。我得到的最接近的方法是使用HashSet.SetEquals,并按照phoog的建议插入一个包装器,用于StructuralCompares.StructuralEqualityComparer

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);
内部类泛型结构比较程序:IEqualityComparer
{
静态GenericStructuralComparer\u实例;
公共静态IEqualityComparer实例
{
获取{return}instance??(_instance=new GenericStructuralComparer());}
}
公共布尔等于(TX,TY)
{
返回StructuralCompares.StructuralEqualityComparer.Equals(x,y);
}
公共int GetHashCode(T obj)
{
返回structuralCompares.StructuralEqualityComparer.GetHashCode(obj);
}
}
公共静态IEqualityComparer结构比较器()
{
返回GenericStructuralComparer.Instance;
}
然后

    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=structuriccomparer();
var s1=新的HashSet(new[]{new[]{1,2},new[]{3,4},comparer);
var s2=新的HashSet(new[]{new[]{1,2},new[]{3,4},comparer);
s1.SetEquals(s2);//真的

否-因为隐式数组相等的定义不超过引用质量;而且在运行时,数组不会提供考虑内部元素的
GetHashCode
,因为正确地说,没有组合hashcode的一般情况,所以框架不会尝试实现一个


您必须自己滚动。

不,默认情况下没有比较器,但您可以创建这样的扩展方法,实现以下功能:

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
公共静态类HashSetExt
{
公共静态bool HashSetEqualsTo(此HashSet集,HashSet其他)
{
return//您自己的比较方法
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var s1=新哈希集(new[]{new[]{1,2},new[]{3,4});
var s2=新哈希集(new[]{new[]{1,2},new[]{3,4});
var isEquals=s1.HashSetEqualsTo(s2);
}
}

我不知道内置的,但它相对容易实现。我看到的最大问题是
GetHashCode()
将是
O(n)
Enumerable.SequenceEqual
会为您完成这项工作吗?不确定是否会出现排序问题…可能..您可以在委托给
StructuralCompares的包装类上实现
IEqualityComparer
。StructuralEqualityComparer
@CodesInChaos
GetHashCode
几乎总是O(n)(除非它是预计算的或不是通过值实现的)
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);
    }
}