IEqualityComparer.Equals quando utilizzato con IEnumerable.Contains è xoy il valore nell'elenco?
-
09-09-2019 - |
Domanda
IEnumberable ha un metodo di estensione contiene
La mia domanda è X o Y il valore dal IEnumerable?
Esempio
List<string> test = new List<String() { "a", "b", "c" };
test.Contains("d", myComparer);
Quando si chiama il metodo Equals per il primo valore sarà Equals ( "a", "d") o uguale ( "d", "a")?
Soluzione
Non dovrebbe importa - l'uguaglianza dovrebbe essere simmetrica. Dalla documentazione per IEqualityComparer<T>.Equals
:
Il metodo Equals è riflessiva, simmetrica e transitiva. Cioè, restituisce true se utilizzato per confrontare un oggetto con se stesso; vero per due oggetti x e y se è vero per y e x; e vero per due oggetti x e z se è vero per x ed y e anche vero per ye z.
Non credo l'utilizzo in Enumerable.Contains
è ben definito, vale a dire che potrebbe cambiare in una versione futura. Se hai appena fate il vostro confronto di uguaglianza obbedire alla documentazione di interfaccia, andrà tutto bene.
Altri suggerimenti
Per ragioni di completezza codice riflessa IEnumberable dimostra che è sul lato sinistro (vedi sotto). Tuttavia, che non è promesso di non cambiare mai, quindi non c'è rischio di utilizzarlo.
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;
}