IEqualityComparer.Equals cuando se utiliza con IEnumerable.Contains es x o y el valor en la lista?
-
09-09-2019 - |
Pregunta
IEnumberable tiene un método de extensión Contiene
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")?
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;
}