Próbuję znaleźć różnicę między dwiema ogólnymi listami, tak jak w poniższym przykładzie. Chociaż t1 i t2 zawierają te same właściwości, nie są tym samym obiektem, więc muszę zaimplementować IEqualityComparer.Linq Z wyjątkiem niestandardowego produktu IEqualityComparer
Wygląda na to, że działa z tym przykładem, ale prawdziwa klasa ma kilka innych właściwości i muszę zrobić to samo z kilkoma innymi klasami.
Więc zastanawiałem się, czy jestem ponownie wynalazca koła?
Czy istnieje łatwiejsza metoda porównywania wszystkich właściwości dwóch obiektów? W tej chwili, naprawdę potrzebuję tylko radzić sobie z klasy zawierające proste typy, ale byłoby miło, że mam porównywarkę, która pracowała z klasami, które zawierają wystąpienia innych klas.
void Main()
{
var t1 = new Sizes { Name = "Test" , Size = 1} ;
var t2 = new Sizes { Name = "Test" , Size = 1} ;
var list1 = new List<Sizes>();
var list2 = new List<Sizes>();
list1.Add(t1);
list2.Add(t2);
var differences = list2.Except(list1 , new SizesComparer());
// differences should be empty.
}
public class Sizes
{
public string Name { get; set; }
public int Size { get; set; }
}
public class SizesComparer : IEqualityComparer<Sizes>
{
bool IEqualityComparer<Sizes>.Equals(Sizes x, Sizes y)
{
return (x.Name.Equals(y.Name) && x.Size.Equals(y.Size));
}
int IEqualityComparer<Sizes>.GetHashCode(Sizes obj)
{
if (Object.ReferenceEquals(obj, null))
return 0;
return obj.Name.GetHashCode() + obj.Size;
}
}
See IEnumerable.Except() i niestandardowych comparer - http://stackoverflow.com/q/1299513/485076 – sll