IEqualityComparer.Equals wenn sie mit IEnumerable.Contains verwendet ist x oder y den Wert in der Liste?
-
09-09-2019 - |
Frage
IEnumberable hat eine Erweiterungsmethode Contains
Meine Frage ist, X oder Y der Wert aus dem IEnumerable?
Beispiel
List<string> test = new List<String() { "a", "b", "c" };
test.Contains("d", myComparer);
Wenn es um die Equals-Methode für den ersten Wert anruft, wird es sein, Equals ( "a", "d") oder Equals ( "d", "a")?
Lösung
Es sollte keine Rolle - Gleichheit symmetrisch sein sollte. Aus der Dokumentation für IEqualityComparer<T>.Equals
:
Die Equals-Methode ist reflexiv, symmetrisch und transitiv. Das ist es wenn verwendet, gibt true zurück, ein vergleichen Objekt mit sich selbst; gilt für zwei Objekte x und y, wenn es wahr für y und x; und gilt für zwei Objekte x und Z, wenn es wahr ist, für x und y sowie gilt für y und z.
Ich glaube nicht, dass die Verwendung in Enumerable.Contains
wohldefiniert, das heißt es in einer zukünftigen Version ändern könnte. Wenn Sie nur Ihren Gleichheitsvergleich die Interface-Dokumentation gehorchen machen, werden Sie in Ordnung sein.
Andere Tipps
Aus Gründen der Vollständigkeit der reflektierte Code von IEnumberable zeigt es auf der linken Seite (siehe unten). Allerdings ist das nicht versprochen, nicht immer zu ändern, so besteht die Gefahr, es zu verwenden.
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;
}