2011-11-14 4 views
2

두 개의 속성 (int Id 및 string Name)을 가진 MyClass라는 클래스가 있다고 가정합니다. 다른 컬렉션에서 이러한 MyClass 개체의 목록을 채우고 싶지만 고유 한 컬렉션 만 원합니다. 이 다른 컬렉션은 값의 배열 인 'Properties'라는 속성이있는 타사 개체로, 처음 두 개는 관심있는 Id 및 Name 값에 해당합니다. 이 컬렉션에는 중복이있을 수 있으므로 고유 한 컬렉션 만 필요합니다.이 LINQ 쿼리가 예상대로 작동하지 않는 이유는 무엇입니까?

트릭을 수행해야하지만 그렇게하지 않으면 중복에 관계없이 모든 항목을 반환합니다. 여기서 내가 뭘 잘못하고 있니?

List<MyClass> items = (from MyClass mc in collectionOfProps 
select new MyClass() { 
Id = collectionOfProps.Properties[0], 
Name = collectionOfProps.Properties[1] }).Distinct().ToList(); 
+0

값은 어떤 유형입니까? –

+0

당신의 질문을 보면, 그것은 나에게 좋을 것 같습니다. –

답변

6

문제는 MyClass가 재정의 EqualsGetHashCode뿐만 아니라 IEquatable<MyClass>를 구현하고 있지 않는 것 같다.

Distinct()을 원하는대로 작동 시키려면 IEquatable<T>을 구현해야합니다. 그렇지 않으면 검사에 기본값 (참조 동등성)을 사용합니다. 즉, 동일한 정확한 인스턴스 인 경우 요소가 별개가 아닌 것으로 판별합니다.

+0

[이 페이지] (http://blog.jordanterrell.com/post/LINQ-Distinct() -does-not-as-expected.aspx)는'IEquatable '을 구현하면 반드시 수정되지 않는 이유를 설명하는 것으로 보입니다. 그 자체의 문제. – Brian

+0

@Brian : 그는'GetHashCode()'도 필요로합니다. – SLaks

+0

@SLaks : 그렇습니다. 그러나'GetHashCode'를'IEqualityComparer'에 채우는 것 역시 도움이되지 않습니다. (분명히 * 도움이 될 것입니다.) 어쨌든, 그 기사에있는 사람은'GetHashCode'를 피하려고 노력하고 있었고, 그의 목표를 달성하기 위해 약간 못 생겼습니다. – Brian

0

MyClass에서 동일성을 재정의 했습니까? 제 추측은 아니오가 될 것입니다. 워드 프로세서에 따르면

:

http://msdn.microsoft.com/en-us/library/bb348436.aspx

기본 같음 비교, 기본은 (T의)을 IEquatable 제네릭 인터페이스를 구현하는 유형의 값을 비교하는 데 사용됩니다. 사용자 지정 데이터 형식을 비교하려면이 인터페이스를 구현하고 형식에 대한 고유 한 GetHashCode 및 Equals 메서드를 제공해야합니다.

1

값을 비교하려면 Equals()GetHashCode()을 대체해야합니다.

+0

SLaks가 정확하다. 적어도 .Net 4.0에서, 'Distinct'는'Set' ('HashSet'와 비슷한'internal' 프레임 워크 클래스)를 사용하여 구현됩니다. – Brian

관련 문제