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
答案 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);
}
}