2010-01-27 3 views
9

- ICollection에 <합니다 MyType > 여부를 결정하는 경우, 어떤 추론이 사용됩니다 (참조? 그것은 중요 않음) Equals 메서드 오버라이드 (override)하지 않는 합니다 MyType을 입력에는 유형의 지정된 인스턴스가 포함되어 있습니까?ICollection에 <T> .Contains는

내 자신의 경험적 방법 (예 : 속성 값의 동일성 확인)을 사용하는 가장 좋은 방법은 무엇입니까?

+0

걸리는 과부하를 사용하는 것입니다? –

+0

System.Collections.ObjectModel.Collection Ben

답변

7

유형이 Equals를 재정의하지 않으므로 참조 평등이라는 기본 구현 인 Equals가 사용됩니다. 컬렉션에 이 포함되어 있고 그 인스턴스가 인 경우 Contains가 true가됩니다.

자신 만의 비교를 사용하려면 IEqualityComparer<T> (예 : ID 비교)을 구현하고 비교 자 인스턴스를 Contains 메소드에 전달하십시오. "기본"ICollection<T>.Contains 메서드에 IEqualityComparer 오버로드가 없으므로 LINQ 확장을 사용할 수 있다고 가정합니다.

+0

주목할 가치가있는 값 유형은 동일하게 취급되며 왜 단순히 equals 메소드를 대체하지 않는가? – Ben

+0

모든 필드가 동일한 경우 값 유형이 동일한 것으로 간주됩니다. 물론 참조 유형과 마찬가지로 값 유형에서 Equals를 대체 할 수 있으며 참조 유형과 마찬가지로 값 유형에 대해 사용자 정의 IEqualityComparer를 작성할 수 있습니다. – itowlson

1

다른 구현에서는 다른 방법을 사용할 수 있습니다. MSDN :

구현 방법은 개체 평등을 결정하는 방법에 따라 달라질 수 있습니다. 예를 들어, List<T>Comparer<T>.DefaultDictionary<TKey, TValue> 반면 사용자가 그냥 참조를 비교합니다 대부분의 경우 키

을 비교하기 위해 사용하는 에게 IComparer<T> 구현을 지정할 수 있습니다 사용하지만 설명서를 확인해야합니다 특정 ICollection<T>을 사용하고 있습니다. 참조가 당신이 언급 한대로 다음, ID를 비교할 수있는 충분하지 않은 경우

0

AFAIK, (메모리 주소)의 기준은

... 비교됩니다.

0

MSDN에 따르면

가 개체의 평등을 결정 방법에 변화 할 수있다

구현; 예를 들어, 목록 <에 대한 (< (T는>)> 중) 사전 < (반면에 .. ::. 기본 (< (T>)>의) 비교 자 <, 를 사용 < (TKEY의, TValue>)>)는 사용자가 키를 비교하는 데 사용할 IComparer < (Of < (>>)>) 구현을 지정할 수있게합니다.

자신에 그것을 할 수있는 가장 좋은 방법은 당신이 사용하는 어떤 구체적인 수집 IEqualityComparer<T>

public class MyComparer : IEqualityComparer<MyType> 
{ 
    public bool Equals(MyType x, MyType y) 
    { 
     return x.Id == y.Id; 
    } 

    public int GetHashCode(MyType obj) 
    { 
     return obj.Id.GetHashCode(); 
    } 
} 
관련 문제