IEqualityComparer.Equals lorsqu'il est utilisé avec IEnumerable.Contains est x ou y la valeur dans la liste?

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

Question

IEnumberable a une méthode d'extension Contient qui prend deux paramètres. Le premier paramètre est la valeur pour vérifier et la seconde est une implémentation de IEqualityComparer. En regardant IEqualityComparer.Equals il prend deux paramètres nommés x et y, pour les premier et deuxième objets à comparer.

Ma question est X ou Y la valeur du IEnumerable?

Exemple

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

Quand il appelle à la méthode Equals pour la première valeur qu'il sera Égal ( "a", "d") ou égal ( "d", "a")?

Était-ce utile?

La solution

Il ne devrait pas importer - l'égalité doit être symétrique. De la documentation pour IEqualityComparer<T>.Equals :

  

La méthode Equals est réflexive,   symétrique et transitive. C'est ça   renvoie true si elle est utilisée pour comparer une   objet avec elle-même; vrai pour les deux   objets x et y, s'il est vrai pour y   et x; et vrai pour les deux objets x et   z si elle est vraie pour x et y et aussi   vrai pour y et z.

Je ne crois pas que l'utilisation dans Enumerable.Contains est bien défini, à savoir qu'il pourrait changer dans une future version. Si vous venez de faire votre comparateur d'égalité obéir à la documentation d'interface, vous serez très bien.

Autres conseils

Par souci d'exhaustivité du code réfléchie de IEnumberable montre qu'il est sur le côté gauche (voir ci-dessous). Cependant, ce n'est pas promis de ne pas changer jamais, donc il y a un risque à l'utiliser.

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top