LINQ Extension Methods: Except

Mittels Except-Erweiterungsmethode vergleicht man zwei Sequenzen des gleichen Typs miteinander und erhält als Ergebnis eine neue Sequenz, in der die Elemente der ersten Sequenz vorhanden sind, die in der 2. Sequenz nicht vorkommen. Dabei wird jedes Element nur einmal aufgeführt. Verglichen wird - wenn man nichts anderes angibt - mit EqualityComparer<T>.Default.

Ohne Except Extension Method kann man das Verhalten in etwa so nachbilden

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private List<T> Except<T>(List<T> list1, List<T> list2, EqualityComparer<T> comparer) {
var ret = new List<T>();
if (comparer == null) comparer = EqualityComparer<T>.Default;
for (int i = 0; i < list1.Count; i++) {
if (
!ret.Contains(list1[i], comparer) &&
!list2.Contains(list1[i], comparer)
) {
ret.Add(list1[i]);
}
}
return ret;
}

Doch zum Glück gibt es die Erweiterungsmethoden, der Aufruf erfolgt in etwa so

1
2
list1.Except(list2);
list1.Except(list2, EqualityComparer<T>.Default);