IEqualityComparer.Equals quando utilizzato con IEnumerable.Contains è xoy il valore nell'elenco?

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

Domanda

IEnumberable ha un metodo di estensione contiene che richiede due parametri. Il primo parametro è il valore da controllare e la seconda è un'implementazione di IEqualityComparer. Guardando IEqualityComparer.Equals prende due parametri denominati x ed y, per il primo e il secondo oggetto da confrontare.

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")?

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top