IEqualityComparer.Equals при использовании с IEnumerable.Contains значение x или y в списке? - PullRequest
2 голосов
/ 15 апреля 2009

IEnumberable имеет метод расширения. Содержит , который принимает два параметра. Первый параметр - это значение для проверки, а второй - реализация IEqualityComparer. Рассматривая IEqualityComparer.Equals, требуется два параметра с именами x и y, для сравнения первого и второго объектов.

Мой вопрос: X или Y значение из IEnumerable?

Пример

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

Когда он вызовет метод Equals для первого значения, он будет Равно ("a", "d") или равно ("d", "a")?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2009

Это не должно иметь значения - равенство должно быть симметричным. Из документов на IEqualityComparer<T>.Equals:

Метод Equals является рефлексивным, симметричный и переходный. То есть это возвращает true, если используется для сравнения возражать против себя; правда для двоих объекты х и у, если это верно для у и х; и верно для двух объектов х и г, если это верно для х и у, а также верно для y и z.

Я не верю, что использование в Enumerable.Contains четко определено, то есть оно может измениться в будущей версии. Если вы просто сделаете свой компаратор равенства подчиненным документации интерфейса, у вас все будет в порядке.

1 голос
/ 20 апреля 2009

Ради полноты отраженный код 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;
}
...