using System.Collections.Generic;
using System.Linq;
namespace YourProject.Extensions
{
public static class ListExtensions
{
public static bool SetwiseEquivalentTo<T>(this List<T> list, List<T> other)
where T: IEquatable<T>
{
if (list.Except(other).Any())
return false;
if (other.Except(list).Any())
return false;
return true;
}
}
}
Manchmal muss man nur wissen, ob zwei Listen unterschiedlich sind und nicht, was diese Unterschiede sind. In diesem Fall sollten Sie diese Erweiterungsmethode zu Ihrem Projekt hinzufügen. Beachten Sie, dass Ihre aufgelisteten Objekte IEquatable implementieren sollten!
Verwendung:
public sealed class Car : IEquatable<Car>
{
public Price Price { get; }
public List<Component> Components { get; }
...
public override bool Equals(object obj)
=> obj is Car other && Equals(other);
public bool Equals(Car other)
=> Price == other.Price
&& Components.SetwiseEquivalentTo(other.Components);
public override int GetHashCode()
=> Components.Aggregate(
Price.GetHashCode(),
(code, next) => code ^ next.GetHashCode()); // Bitwise XOR
}
Was auch immer die Component
Klasse ist, die hier gezeigten Methoden fürCar
nahezu identisch implementiert werden.
Es ist sehr wichtig zu beachten, wie wir GetHashCode geschrieben haben. Um richtig umzusetzen IEquatable
, Equals
und GetHashCode
muss auf der Instanz Eigenschaften in eine logisch kompatibelen Weise.
Zwei Listen mit demselben Inhalt sind immer noch unterschiedliche Objekte und erzeugen unterschiedliche Hash-Codes. Da diese beiden Listen gleich behandelt werden sollen, müssen wir GetHashCode
für jede Liste den gleichen Wert erzeugen. Dies können wir erreichen, indem wir den Hashcode an jedes Element in der Liste delegieren und alle mit dem standardmäßigen bitweisen XOR kombinieren. XOR ist auftragsunabhängig, daher spielt es keine Rolle, ob die Listen unterschiedlich sortiert sind. Es ist nur wichtig, dass sie nur gleichwertige Mitglieder enthalten.
Hinweis: Der seltsame Name bedeutet, dass die Methode die Reihenfolge der Elemente in der Liste nicht berücksichtigt. Wenn Sie sich für die Reihenfolge der Elemente in der Liste interessieren, ist diese Methode nichts für Sie!