Задача: есть два списка объектов одного типа. Объекты могут повторяться. Нужно взять из второго списка только те объекты, которых нет в первом.
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());