Задача: есть два списка объектов одного типа. Объекты могут повторяться. Нужно взять из второго списка только те объекты, которых нет в первом.
var newArticles = allArticles.Except(oldArticles, new ArticleEqualityComparer());
ArticleEqualityComparer реализован по примеру с MSDN:
http://msdn.microsoft.com/ru-ru/library/ms132151.aspx
class BoxEqualityComparer : IEqualityComparer { public bool Equals(Box b1, Box b2) { if (b1.Height == b2.Height & b1.Length == b2.Length & b1.Width == b2.Width) { return true; } else { return false; } } public int GetHashCode(Box bx) { int hCode = bx.Height ^ bx.Length ^ bx.Width; return hCode.GetHashCode(); } }
И еще пример для сравнения списков в списках
http://social.msdn.microsoft.com/Forums/en-US/2ff3016c-bd61-4fec-8f8c-7b6c070123fa/c-compare-two-lists-of-objects
public class ListComparer : IEqualityComparer<List> { IEqualityComparer itemComparer; public ListComparer() { itemComparer = EqualityComparer.Default; } public ListComparer(IEqualityComparer innerComparer) { itemComparer = innerComparer; } public bool Equals(List x, List y) { return x.SequenceEqual(y, itemComparer); } public int GetHashCode(List obj) { int somePrimeNumber = 37; int result = 1; foreach (T item in obj.Take(5)) { result = (somePrimeNumber * result) + itemComparer.GetHashCode(item); } return result; } }
Вызов:
List<List> first = new List<List>() { new List{"1", "2"}, new List{"a", "b"} }; List<List> second = new List<List>() { new List{"1", "2"}, new List{"a", "b"} }; bool areEqual = first.SequenceEqual(second, new ListComparer());