IEqualityComparer.Equals wenn sie mit IEnumerable.Contains verwendet ist x oder y den Wert in der Liste?

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

Frage

IEnumberable hat eine Erweiterungsmethode Contains , die zwei Parameter übernimmt. Der erste Parameter ist der Wert, zu überprüfen und die zweite ist eine Implementierung des IEqualityComparer. Mit Blick auf IEqualityComparer.Equals dauert es zwei Parameter namens x und y, für die ersten und zweiten Objekte zu vergleichen.

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

War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top