IEqualityComparer.Equals lorsqu'il est utilisé avec IEnumerable.Contains est x ou y la valeur dans la liste?
-
09-09-2019 - |
Question
IEnumberable a une méthode d'extension Contient
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")?
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;
}