In einem früheren Artikel habe ich Ihnen einen Crashkurs in LINQ gegeben. Aufbauend auf diesem Artikel möchte ich Ihnen weitere nützliche LINQ Funktionen vorstellen.
Übersicht
In diesem Artikel werden die folgenden LINQ Funktionen vorgestellt:
Set Operatoren
- Distinct
- Except
- Union
- Intersect
Generierungsoperatoren
- Enumerable.Range
- Enumerable.Repeat
Aufteilungsoperatoren
- Take
- TakeWhile
- Skip
- SkipWhile
Set Operatoren
Distinct
|
Entfernt sich wiederholende Elemente so dass jedes Element nur einfach vorkommt.
|
Except
|
Entfernt die Elemente aus der Ergebnisliste welche in der Filterliste angegeben sind. Ausserdem werden doppelte Einträge entfernt, also indirekt ein zusätzliches Distinct durchgeführt.
|
Union
|
Verbindet zwei Listen miteinander indem alle Elemente aus beiden Listen verwendet werden. Aus der erstellten Gesamtmenge werden die doppelten Einträge entfernt.
|
Intersect
|
Verbindet zwei Listen miteinander indem die Schnittmenge gebildet wird. Das heisst, es werden nur die Elemente verwendet die in beiden Listen vorkommen. Auch hier werden doppelte Einträge entfernt.
|
Das nachfolgende Beispiel zeigt diese vier Operatoren. Die jeweiligen Ergebnislisten sind als Kommentar im Quellcode angegeben.
1 List<string> valuesA = new List<string>() { "A", "A", "B", "B", "C" };
2 List<string> valuesB = new List<string>() { "A", "C", "E" };
3
4 //A B C
5 var resultsDistinct = valuesA.Distinct();
6
7 //B
8 var resultsExcept = valuesA.Except(valuesB);
9
10 //A B C E
11 var resultsUnion = valuesA.Union(valuesB);
12
13 //A C
14 var resultsIntersect = valuesA.Intersect(valuesB);
Generierungsoperatoren
Enumerable.Range
|
Erzeugt eine definierbare Anzahl von integer Werten ausgehend vom angegeben Startwert.
|
Enumerable.Repeat
|
Vervielfacht die Werte einer Liste.
|
Das nachfolgende Beispiel zeigt die Verwendung der Generierungsoperatoren.
1 List<string> values = new List<string>() { "A", "B", "C" };
2
3 //10 11 12 13 14
4 var resultsRange = Enumerable.Range(10, 5);
5
6 //A B C A B C A B C
7 var resultsRepeat = Enumerable.Repeat(values, 3).SelectMany(x => x);
Aufteilungsoperatoren
Take
|
Holt die ersten x Elemente aus der Wertmenge.
|
TakeWhile
|
Holt die Elemente so lange aus der Wertmenge bis das angegebene Prädikat false ergibt oder die Werte durchlaufen wurden.
|
Skip
|
Überspringt die ersten x Elemente der Wertmenge.
|
SkipWhile
|
Überspringt die Elemente so lange wie das Ergebnis des Prädikats true ist. Sobald das Prädikat false ergibt, werden das Element und alle folgenden Elemente in die Ergebnisliste übernommen.
|
Das nachfolgende Beispiel zeigt die Verwendung der Aufteilungsoperatoren.
1 List<string> values = new List<string>() { "John", "Jim", "Sarah"};
2
3 //John Jim
4 var resultsTake = values.Take(2);
5
6 //John
7 var resultsTakeWhile = values.TakeWhile(n => n.Length > 3);
8
9 //Sarah
10 var resultsSkip = values.Skip(2);
11
12 //Jim Sarah
13 var resultsSkipWhile = values.SkipWhile(n => n.Length > 3);
Fazit
LINQ bietet viele Operatoren welche ein effizientes Auswerten von Datenmengen erlauben. Als Softwareentwickler sollte man diese kennen und anwenden. Diese Artikelserie werde ich daher fortsetzen und Ihnen weitere LINQ Operatoren und LINQ Features vorstellen.