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;
}
}
}
Parfois, il suffit de savoir si deux listes sont différentes et non pas quelles sont ces différences. Dans ce cas, envisagez d'ajouter cette méthode d'extension à votre projet. Notez que vos objets listés doivent implémenter IEquatable!
Usage:
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
}
Quelle que soit la Component
classe, les méthodes présentées ici Car
doivent être implémentées de manière presque identique.
Il est très important de noter comment nous avons écrit GetHashCode. Afin d'implémenter correctement IEquatable
, Equals
et GetHashCode
doit fonctionner sur les propriétés de l'instance d'une manière logiquement compatible.
Deux listes avec le même contenu sont toujours des objets différents et produiront des codes de hachage différents. Puisque nous voulons que ces deux listes soient traitées comme égales, nous devons laisser GetHashCode
produire la même valeur pour chacune d'elles. Nous pouvons accomplir cela en déléguant le code de hachage à chaque élément de la liste et en utilisant le XOR au niveau du bit standard pour les combiner tous. XOR est indépendant de l'ordre, donc peu importe si les listes sont triées différemment. Il importe seulement qu'ils ne contiennent que des membres équivalents.
Remarque: le nom étrange signifie que la méthode ne prend pas en compte l'ordre des éléments dans la liste. Si vous vous souciez de l'ordre des éléments dans la liste, cette méthode n'est pas pour vous!