2009-10-25 14 views
8

çiftleri bırakırLinQ şu dersleri var

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

Ama farklı ne yapmaz ben Aşağıdaki kodun gösterdiği gibi bunu yapmak istiyorum:

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

Bunu yanlış bir şekilde mi kullanıyorum? Neden onları niyet ettiğim gibi karşılaştırmıyorlar?

Düzenleme

: olması gerektiği gibi aşağıdaki döndürür true karşılaştırıcısı yapar çalışmalarını göstermek için:

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 yok (bkz. Http://stackoverflow.com/questions/247621/what-are-the-correct-version-numbers-for-c) – Vaccano

cevap

10

Senin sorunun doğru IEqualityComparer uygulamak vermedi olmasıdır. Eğer IEqualityComparer<T> uygulamak herhangi iki eşit nesneleri aynı karma kodunun olması için

, sen GetHashCode uygulamalıdır. Aksi takdirde, burada gördüğünüz gibi yanlış davranışlar alırsınız.

aşağıdaki gibi GetHashCode uygulamalıdır: (this answer nezaket)

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

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

    return hash; 
} 

Ayrıca tutarlı olması için SupplierCategory yılında GetHashCode geçersiz kılmak gerekir. Örneğin:

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

Son olarak, muhtemelen SupplierCategory içinde Equals geçersiz kılmak ve bunu IEquatable için uygulanan Equals yöntemini çağırmak yapmalıdır gerekmez rağmen.

4

Aslında, bu sorun şu belgelerde yer almaktadır: http://msdn.microsoft.com/en-us/library/bb338049.aspx.

+0

Topluluk İçeriği'nde mi demek istiyorsunuz? – SLaks

+0

Hayır, bu belgede kendi karşılaştırıcınızı nasıl oluşturacağınızı gösteren VB ve C# kod örnekleri yer almaktadır. Ayrıca GetHashCode ve Equals yöntemlerini nasıl geçersiz kılabileceğinizi gösterir. –