In einem vorhergehenden Artikel habe ich Ihnen bereits einige LINQ Operatoren vorgestellt. Darauf aufbauend möchte ich Ihnen weitere Operatoren näher bringen.
Übersicht
In diesem Artikel werden die folgenden LINQ Funktionen vorgestellt:
Quantifizierungsoperatoren
- Any
- Any mit Prädikat
- All
Elementaroperatoren
- First
- Last
- First mit Prädikat
- Last mit Prädikat
- FirstOrDefault
- LastOrDefault
- Single
- SingleOrDefault
- ElementAt
- ElementAtOrDefault
- DefaultIfEmpty
Quantifizierungsoperatoren
Any
|
Prüft ob eine Liste werte enthält
|
Any mit Prädikat
|
Prüft ob eine Liste einen bestimmten Wert enthält, beziehungsweise ob ein Wert eine bestimmte Bedingung erfüllt.
|
All
|
Prüft ob alle Elemente der liste die Bedingung erfüllen.
|
Das nachfolgende Beispiel zeigt diese Operatoren. Die jeweiligen Ergebnisse sind als Kommentar im Quellcode angegeben.
1 List<string> values = new List<string>() { "John", "Jim", "Sarah"};
2
3 //true
4 bool resultAny1 = (from value in values
5 where value == "John"
6 select value).Any();
7
8 //false
9 bool resultAny2 = (from value in values
10 where value == "Tom"
11 select value).Any();
12
13 //true
14 bool resultAny3 = values.Any(c => c == "John");
15
16 //false
17 bool resultAny4 = values.Any(c => c == "Tom");
18
19 //true
20 bool resultAll1 = values.All(c => c.Length > 2);
21
22 //false
23 bool resultAll2 = values.All(c => c.Length > 3);
Elementaroperatoren
First / Last ohne Prädikat | Gibt das erste bzw. letzte Element der Ergebnisliste zurück. Ist die Liste leer wird eine InvalidOperationException geworfen.
|
First / Last mit Prädikat | Gibt das erste bzw. letzte Element der Ergebnisliste zurück welches dem angegebenen Prädikat entspricht. Ist die Liste leer oder enthält kein mit dem Prädikat übereinstimmendes Element wird eine InvalidOperationException geworfen.
|
FirstOrDefault / LastOrDefault
(mit und ohne Prädikat) |
Gibt das erste bzw. letzte Element der Ergebnisliste. Wie zuvor kann eine Angabe mit oder ohne Prädikat erfolgen.
Wird kein Element gefunden wird aber keine InvalidOperationException geworfen sondern der defaut Wert des Typs zurück gegeben, beispielsweise null bei einem string.
|
Single | Dient zum Auffinden eines eindeutigen Elements. Entsprechen mehrere Elemente in der Liste dem Prädikat wird eine InvalidOperationException geworfen
|
SingleOrDefault | Dient zum Auffinden eines eindeutigen Elements. Wird kein Element gefunden wird keine InvalidOperationException geworfen sondern der defaut Wert des Typs zurück gegeben, beispielsweise null bei einem string.
|
ElementAt
|
Gibt ein Element aus der Liste anhand des index zurück (0 basiert). Liegt die Position nicht innerhalb der Liste wird eine InvalidOperationException geworfen.
|
ElementAtOrDefault
|
Gibt ein Element aus der Liste anhand des index zurück (0 basiert). Liegt die Position nicht innerhalb der Liste wird der default Wert des Typs zurück gegeben und keine InvalidOperationException geworfen.
|
DefaultIfEmpty
|
Prüft ob die Ergebnisliste leer ist und gibt in diesem Fall den angegebenen Wert zurück.
|
Das nachfolgende Beispiel zeigt diese Operatoren.
1 List<string> values = new List<string>() { "John", "Jim", "Sarah"};
2
3 //John
4 var resultFirst = values.First();
5
6 //Sarah
7 var resultLast= values.Last();
8
9 //Jim
10 var resultFirstPredicate = values.First(n => n.Length == 3);
11
12 //Jim
13 var resultSingle = values.Single(n => n.Length == 3);
14
15 //Sarah
16 var resultElementAt = values.ElementAt(2);
17
18 //null
19 var resultFirstOrDefault = values.FirstOrDefault(n => n.Length == 7);
20
21 //Liste mit einem Element mit dem Wert ’not found‘
22 var resultDefaultIfEmpty = (from value in values
23 where value.Length == 8
24 select value).DefaultIfEmpty("not found");
Fazit
Die hier vorgestellten Operatoren für LINQ Abfragen stellen praxisrelevante Möglichkeiten für Datenabfragen dar. Mittels dieser LINQ Operatoren entfallen die sonst nötigen (verschachtelten) Schleifen welche sich andernfalls bei der Datenauswertung ergeben würden. Dadurch lässt sich besser lesbarer Quellcode erzeugen.