2012-03-28 8 views
2
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 
+0

は、私は1つに建てられたのか分からないが、それは1を実装するのは比較的簡単ですが。私が見ている最大の問題は 'GetHashCode()'が 'O(n)'になるということです。 – CodesInChaos

+1

'Enumerable.SequenceEqual'があなたの仕事ですか?おそらく注文の問題があるかどうかわからない...おそらく.. – Servy

+1

'StructuralComparisons.StructuralEqualityComparer'に委譲するラッパークラスに' IEqualityComparer 'を実装することができます。 – phoog

答えて

2

ません - 暗黙の配列の平等は、リファレンスを超えて定義されていないので、品質;実行時に配列には内側の要素を考慮に入れたGetHashCodeが用意されていません。なぜなら、正しく、ハッシュコードを結合する一般的なケースはないからです。したがって、フレームワークは実装しません。

自分でロールバックする必要があります。

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