2009-04-15 1 views
2

IEnumberable에는 확장 메서드가 있습니다. 두 개의 매개 변수를 사용하는 <T>을 포함합니다. 첫 번째 매개 변수는 확인할 값이고 두 번째 매개 변수는 IEqualityComparer의 구현입니다. IEqualityComparer.Equals에서 비교할 첫 번째 및 두 번째 개체에 대해 x 및 y라는 두 개의 매개 변수가 필요합니다.IEqualityComparer.Equals를 IEnumerable.Contains와 함께 사용하면 x 또는 y 값이 목록에 있습니까?

제 질문은 X 또는 Y가 IEnumerable의 값입니까?

List<string> test = new List<String() { "a", "b", "c" }; 
test.Contains("d", myComparer); 

그것이 같음 ("A", "D") 또는 같음 될 첫번째 값 같음 메소드 호출하면 ("D", "A") ?

답변

3

평등은 대칭이어야합니다. IEqualityComparer<T>.Equals에 대한 문서에서 :

는 대칭 및 전이, 방법은 재귀입니다 같음. 즉 은 개체를 자체와 비교하는 데 사용되면 true를 반환합니다. 두 개의 경우 true 개체에 대해 x 및 y가 참이면 및 x; 두 개체 x 및 z에 대해 true이면 x 및 y에 대해 true이고 y 및 z에 대해서도 이 참입니다.

Enumerable.Contains의 사용법은 잘 정의되어 있지 않습니다. 즉, 이후 버전에서 변경 될 수 있습니다. 동등 비교자를 인터페이스 문서에 따라야 만한다면 괜찮을 것입니다.

+0

여전히 IComparer 은 (과) 전이가 필요하지 않습니다. 실제로는 문자열이 아닙니다. –

1

IEnumberable의 반사 코드는 왼쪽에 있음을 보여줍니다 (아래 참조). 그러나 변경되지 않는다고 약속하지 않으므로 사용하는 데 위험이 따릅니다.

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer) 
{ 
    if (comparer == null) 
    { 
     comparer = EqualityComparer<TSource>.Default; 
    } 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    foreach (TSource local in source) 
    { 
     if (comparer.Equals(local, value)) 
     { 
      return true; 
     } 
    } 
    return false; 
}