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);
(デフォルト?)コンストラクタs1.Equals(s2)がtrueになるようにHashSetにプラグインできますか? StructuralComparisons.StructuralEqualityComparerがありますが、HashSetには一般的なIEqualityComparer <>が必要です。int配列のハッシュセットの構造の比較
UPDATE:それは今までに仕事ができるように
は見えません。 phoogにより示唆されるように私が手に最も近いHashSet.SetEqualsを使用して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
は、私は1つに建てられたのか分からないが、それは1を実装するのは比較的簡単ですが。私が見ている最大の問題は 'GetHashCode()'が 'O(n)'になるということです。 – CodesInChaos
'Enumerable.SequenceEqual'があなたの仕事ですか?おそらく注文の問題があるかどうかわからない...おそらく.. – Servy
'StructuralComparisons.StructuralEqualityComparer'に委譲するラッパークラスに' IEqualityComparer 'を実装することができます。 –
phoog