iequalitycomparer.equals ienumerable과 함께 사용하면 x 또는 y가 목록의 값입니까?

StackOverflow https://stackoverflow.com/questions/751081

문제

ienumberable에는 확장 방법이 포함되어 있습니다u003CT> 두 개의 매개 변수가 필요합니다. 첫 번째 매개 변수는 확인할 값이고 두 번째 매개 변수는 iequalitycomparer의 구현입니다. iqualitycomparer.equals를 보면 첫 번째와 두 번째 객체를 비교하려면 x와 y라는 두 개의 매개 변수가 필요합니다.

내 질문은 x 또는 y입니다.

예시

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

첫 번째 값에 대한 동등한 메소드를 호출 할 때 ( "A", "D") 또는 동등한 ( "D", "A")입니까?

도움이 되었습니까?

해결책

중요하지 않아야합니다 - 평등은 대칭이어야합니다. 문서에서 IEqualityComparer<T>.Equals:

동등한 방법은 반사적이고 대칭이며 전이 적입니다. 즉, 객체를 그 자체와 비교하는 데 사용되면 사실이 반환됩니다. y와 x에 대해 true 인 경우 두 객체 x와 y의 경우 true; 그리고 x와 y의 경우에도 두 개의 객체 x와 z의 경우 y와 z의 경우에도 마찬가지입니다.

나는 사용법을 믿지 않는다 Enumerable.Contains 잘 정의되어 있습니다. 즉, 향후 버전에서 변경 될 수 있습니다. 평등 비교를 위해 인터페이스 문서를 준수하면 괜찮을 것입니다.

다른 팁

완전성을 위해 반사 된 코드는 왼쪽에 있음을 보여줍니다 (아래 참조). 그러나 그것은 결코 변화하지 않겠다는 약속이 없으므로 그것을 사용할 위험이 있습니다.

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top