2009-10-25 8 views
8

重複残しきゅうは、私は次のクラス持っ

CategoryPathComparer comparer = new CategoryPathComparer(); 
List<List<SupplierCategory>> categoryPaths = (from i in infoList 
                  select 
                  new List<SupplierCategory>() { 
                  new SupplierCategory() { Name = i[3] }, 
                  new SupplierCategory() { Name = i[4], Parent = i[3] }, 
                  new SupplierCategory() { Name = i[5], Parent = i[4] }}).Distinct(comparer).ToList(); 

をしかし、明確な何をしていませんが、私次のコードで示しているようにしてください:

comp.Equals(categoryPaths[0], categoryPaths[1]); //returns True 

私はこれを間違った方法で使用していますか?なぜ彼らは私が彼らを向けるように比較されていないのですか?あなたの問題はあなたが正しくIEqualityComparerを実装していなかったということです

List<SupplierCategory> list1 = new List<SupplierCategory>() { 
    new SupplierCategory() { Name = "Cat1" }, 
    new SupplierCategory() { Name = "Cat2", Parent = "Cat1" }, 
    new SupplierCategory() { Name = "Cat3", Parent = "Cat2" } 
}; 
List<SupplierCategory> list1 = new List<SupplierCategory>() { 
    new SupplierCategory() { Name = "Cat1" }, 
    new SupplierCategory() { Name = "Cat2", Parent = "Cat1" }, 
    new SupplierCategory() { Name = "Cat3", Parent = "Cat2" } 
}; 
CategoryPathComparer comp = new CategoryPathComparer(); 
Console.WriteLine(comp.Equals(list1, list2).ToString()); 
+0

Retag。 C#3.5はありません(http://stackoverflow.com/questions/247621/what-are-the-correct-version-numbers-for-c) – Vaccano

答えて

10

編集:それが必要として 比較子を実証するためには、仕事、以下の戻り真を行います。

IEqualityComparer<T>を実装する場合、で、GetHashCodeを実装する必要があります。同じオブジェクトが同じハッシュコードになるようにします。

そうしないと、ここに表示されているとおり、正しく動作しなくなります。

次のようにして、GetHashCodeメソッドを実装する必要があります(this answerの礼儀)

public int GetHashCode(List<SupplierCategory> obj) { 
    int hash = 17; 

    foreach(var value in obj) 
     hash = hash * 23 + obj.GetHashCode(); 

    return hash; 
} 

あなたも矛盾しないようにSupplierCategoryGetHashCodeをオーバーライドする必要があります。たとえば、次のように

public override int GetHashCode() { 
    int hash = 17; 
    hash = hash * 23 + Name.GetHashCode(); 
    hash = hash * 23 + Parent.GetHashCode(); 
    return hash; 
} 

最後に、あなたは、あなたはおそらくSupplierCategoryEqualsをオーバーライドして、それはあなたがIEquatableのために実装Equalsメソッドを呼び出す行う必要がありますする必要はありませんが。

4

実際には、この問題はドキュメントでもカバーされています。 http://msdn.microsoft.com/en-us/library/bb338049.aspx

+0

コミュニティコンテンツの意味ですか? – SLaks

+0

いいえ、ドキュメントにはVBとC#のコードサンプルが含まれており、独自の比較対象を作成する方法を示しています。また、GetHashCodeメソッドとEqualsメソッドをオーバーライドする方法も示します。 –

関連する問題