2009-10-25 1 views
8

중복 잎LINQ 내가 다음과 같은 클래스있어

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

을하지만 별개의 무엇을하지 않습니다 I 다음 코드에서 보여 주듯이해야합니다.

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

잘못된 방식으로 사용하고 있습니까? 왜 나는 그들이 의도 한대로 비교되지 않습니까?

편집

: 은 예상대로 다음 true를 반환,하여 비교 자가하는 일을 보여주기 위해 :

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를 구현하지 않은 것입니다.

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를 오버라이드 (override) 할 필요가있다. 예를 들면 :

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 메서드를 재정의하는 방법도 보여줍니다. –