IEqualityComparer.Equals cuando se utiliza con IEnumerable.Contains es x o y el valor en la lista?

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

Pregunta

IEnumberable tiene un método de extensión Contiene que toma dos parámetros. El primer parámetro es el valor a comprobar y la segunda es una implementación de IEqualityComparer. En cuanto a IEqualityComparer.Equals que toma dos parámetros con nombre X e Y, para el primer y segundo objetos para comparar.

Mi pregunta es X o Y el valor de la IEnumerable?

Ejemplo

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

Cuando se llama al método Equals para el primer valor será Es igual a ( "a", "d") o igual ( "d", "a")?

¿Fue útil?

Solución

No debería importar - la igualdad debe ser simétrica. A partir de la documentación para IEqualityComparer<T>.Equals :

  

el método equals es reflexiva,   simétrica y transitiva. Eso es   devuelve verdadero si se utiliza para comparar una   objeto con sí mismo; verdadera para dos   Objetos x e y si es verdadero para y   y X; y cierto para dos objetos X y   z si es verdad para X e Y y también   verdadero para y y z.

No creo que está bien definido el uso de Enumerable.Contains, es decir, que podría cambiar en una versión futura. Si usted acaba de hacer su comparador de igualdad obedecen a la documentación de la interfaz, se le multa.

Otros consejos

En aras de la integridad del código reflejado de IEnumberable muestra que está en el lado izquierdo (véase más adelante). Sin embargo, que no se promete no cambiar nunca, por lo que hay riesgo en su uso.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top