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 ce que sont ces différences. Dans ce cas, pensez à ajouter cette méthode d'extension à votre projet. Notez que vos objets listés doivent implémenter IEquatable !
Utilisation :
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
}
Quel que soit le Component
est, les méthodes présentées ici pour Car
devraient être mis en œuvre 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 opèrent sur les propriétés de l'instance d'une manière logiquement compatible.
Deux listes ayant 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 étant égales, nous devons laisser la fonction GetHashCode
produire la même valeur pour chacun d'eux. Nous pouvons accomplir cela en déléguant le code de hachage à chaque élément de la liste, et en utilisant le XOR standard par bit pour les combiner tous. XOR est indépendant de l'ordre, donc peu importe que les listes soient triées différemment. Il importe seulement qu'elles ne contiennent que des éléments équivalents.
Note : le nom étrange est pour impliquer le fait que la méthode ne considère pas l'ordre des éléments dans la liste. Si vous vous souciez de l'ordre des éléments de la liste, cette méthode n'est pas pour vous !
1 votes
Si vous rencontrez cette question et que vous envisagez d'ajouter une nouvelle réponse, veuillez noter qu'ils ne demandent pas de a mais le le plus rapide manière.