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;
}
}
}
A veces solo necesitas saber si dos listas son diferentes, y no cuáles son esas diferencias. En ese caso, considere agregar este método de extensión a su proyecto. Tenga en cuenta que sus objetos listados deben implementar IEquatable!
Uso:
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
}
Cualquiera sea la Component
clase, los métodos que se muestran aquí paraCar
deben implementarse casi de manera idéntica.
Es muy importante tener en cuenta cómo hemos escrito GetHashCode. Para implementar correctamente IEquatable
, Equals
y GetHashCode
debe operar en las propiedades de la instancia de una manera lógicamente compatible.
Dos listas con el mismo contenido siguen siendo objetos diferentes y producirán diferentes códigos hash. Como queremos que estas dos listas sean tratadas como iguales, debemos dejar que GetHashCode
produzca el mismo valor para cada una de ellas. Podemos lograr esto delegando el código hash a cada elemento de la lista y usando el XOR bit a bit estándar para combinarlos a todos. XOR es independiente del orden, por lo que no importa si las listas están ordenadas de manera diferente. Solo importa que no contengan nada más que miembros equivalentes.
Nota: el nombre extraño implica el hecho de que el método no considera el orden de los elementos en la lista. Si te importa el orden de los elementos en la lista, ¡este método no es para ti!