IEqualityComparer.Equals quando usado com IEnumerable.Contains é x ou y o valor na lista?
-
09-09-2019 - |
Pergunta
IEnumberable tem um método de extensão Contém
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")?
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;
}