IEqualityComparer.Equals quando usado com IEnumerable.Contains é x ou y o valor na lista?

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

Pergunta

IEnumberable tem um método de extensão Contém que tem dois parâmetros. O primeiro parâmetro é o valor para verificar e o segundo é uma implementação de IEqualityComparer. Olhando para IEqualityComparer.Equals leva dois parâmetros nomeados x e y, para o primeiro e segundo objectos para comparar.

A minha pergunta é X ou Y o valor do IEnumerable?

Exemplo

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

Quando se chama o método Equals para o primeiro valor que vai ser Equals ( "a", "d") ou igual ( "d", "a")?

Foi útil?

Solução

Não deve importar - igualdade deve ser simétrica. De docs para IEqualityComparer<T>.Equals :

O método Equals é reflexiva, simétrica e transitiva. É isso retorna true se usado para comparar um opor-se com; verdadeiro para dois objetos x e y se é verdade para y e X; e verdadeiro para dois objetos x e z, se é verdade para x e y e também verdadeiro para y e z.

Eu não acredito que o uso em Enumerable.Contains é bem definido, ou seja, ele poderia mudar em uma versão futura. Se você acabou de fazer o seu comparador de igualdade obedecer a documentação interface, você vai ficar bem.

Outras dicas

Por uma questão de exaustividade o código refletido de shows IEnumberable é no lado esquerdo (veja abaixo). No entanto isso não é prometido para não mudar nunca, então não há risco em usá-lo.

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top