LINQ i kolekcje obiektów - Wybór elementu z kolekcji
Autor: Paweł Sołtysiak
Opublikowano: 2012-03-19
W poprzednich artykułach z cyklu dowiedziałeś się, w jaki sposób można wybierać wiele elementów z kolekcji. LINQ umożliwia również pobranie pojedynczego elementu. Operator First zwraca pierwszy element z kolekcji, który spełnia podany warunek. Operator ElementAt(n) zwraca n-ty element kolekcji, a operator Single służy do upewnienia się, czy w kolekcji znajduje się jeden element spełniający warunek. Każdy z tych operatorów posiada wariant z końcówką OrDefault (FirstOrDefault, ElementAtOrDefault oraz SingleOrDefault). Taki operator, zamiast zwrócić w przypadku błędu wyjątek, zwraca domyślną wartość dla kolekcji.
Przed wykonaniem zadań powinieneś wiedzieć:
- jak utworzyć nowy projekt konsolowy w języku w Visual Studio (od wersji 2008),
- jak posługiwać się tablicami oraz kolekcjami,
- jak sortować elementy w kolekcji przy użyciu OrderBy.
Po wykonaniu zadań nauczysz się:
- jak wykorzystać operator First do znalezienia pierwszego elementu spełniającego określony warunek,
- jak wykorzystać operator ElementAt do zwrócenia elementu z określonej pozycji,
- jak wykorzystać Single do upewnienia się, że kolekcja zawiera tylko jeden taki element, który spełnia warunek.
Implementacja
W Visual Studio (od wersji 2008) utwórz nowy projekt konsolowy dla języka C#.
Twoim zadaniem będzie sprawdzenie, jak działają operatory First, ElementAt oraz Single.
Operator First
W celu odnalezienia pierwszego elementu z kolekcji, używamy operatora First, który jest większy od 5.
- Otwórz plik o nazwie Program.cs
- Wewnątrz funkcji Main wpisz:
var numbers = new[] { 3, 5, 4, 7, 2, 1, 9, 6 };
var biggerThan5 = numbers.First(x => x > 5);
Console.WriteLine("Pierwsza liczba wewnątrz kolekcji większa niż 5: " + biggerThan5);
- Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F5)
- Powinien uruchomić się program wyświetlający pierwszą liczbę z tablicy, która jest liczbą większą niż 5. Sytuacja została przedstawiona na Rys. 1.
Rys. 1. Wynik wyszukiwania w kolekcji pierwszej liczby większej niż 5.
Informacja |
Operator First zwraca pierwszy element, który spełnia warunek, który został określony w postaci wyrażenia lambda. W przypadku nie odnalezienia żadnego elementu, który spełniałby podany warunek, operator zwraca wyjątek o typie InvalidOperationException. Więcej informacji o wyrażeniu lambda przeczytasz pod hasłem: Lambda Expressions (C# Programming Guide). |
Operator FirstOrDefault
Operator FirstOrDefault różni się od operatora First tym, że zwraca wartość domyślną zamiast zwracać wyjątek.
- Zamień kod z poprzedniego zadania następującym kodem:
var numbers = new[] { 3, 5, 4, 2, 1, 0 };
var biggerThan5 = numbers.FirstOrDefault(x => x > 5);
Console.WriteLine("Pierwsza liczba wewnątrz kolekcji większa niż 5: " + biggerThan5);
- Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F5).
- Powinien uruchomić się program, który wyświetlił wartość domyślną dla typu int, ponieważ nie została znaleziona wartość, spełniająca warunek x > 5. Sytuację zilustrowano na Rys. 2.
Rys. 2. Wynik wyszukiwania w kolekcji liczby większej niż 5.
Informacja |
Wartością domyślną, zwracaną przez operatora, jest wartość, którą otrzymujemy z operatora default(T), gdzie T to dowolny typ. W tym przypadku, wartością domyślną dla typu int jest liczba 0. |
Operator ElementAt
Operator ElementAt służy do zwrócenia wartości elementu kolekcji na określonej pozycji.
- Zamień kod z poprzedniego zadania następującym kodem:
var numbers = new[] { 44, 66, 55, 11, 99, 22, 88, 33, 77 };
var secoundBiggest = (from number in numbers
orderby number descending
select number).ElementAt(1);
Console.WriteLine("Druga największa liczba w kolekcji: " + secoundBiggest);
- Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F5).
- Powinien uruchomić się program, który wyświetli drugą największą wartość w tablicy. Sytuacja została zaprezentowana na Rys. 3.
Rys. 3. Wynik zwrócenia drugiego elementu z kolekcji.
Informacja |
Pamiętaj, że numeracja elementów zaczyna się od zera, czyli element o indeksie 1 jest drugim elementem w kolekcji. |
Operator Single
Operator Single służy do stwierdzenia, czy istnieje tylko jeden element w kolekcji, spełniający określony warunek.
- Zamień kod z poprzedniego zadania następującym kodem:
var arrayWithOneEvenNumber = new[] { 3, 5, 7, 4, 9, 1 };
var number = arrayWithOneEvenNumber.Single(x => x % 2 == 0);
Console.WriteLine("Jedyna liczba parzysta w tablicy: " + number);
- Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F5).
- Powinien uruchomić się program wyświetlający jedyną parzystą liczbę w tablicy. Sytuacja została przedstawiona na Rys. 4.
Rys. 4. Wynik znalezienia pojedynczej liczby parzystej w tablicy.
Informacja |
Operator Single sprowadza wszystkie elementy w kolekcji, jeżeli znajdzie tylko jeden element spełniający warunek. Ten element zostanie wówczas zwrócony. W przypadku, gdy taki element się nie znajdzie, to zostanie zwrócony wyjątek InvalidOperationException. |
Podsumowanie
W tym artykule nauczyłeś się, jak wykorzystać operator First do znalezienia pierwszego elementu w kolekcji, spełniającego określony warunek. Dowiedziałeś się, że operator FirstOrDefault zwraca wartość domyślną, gdy nie znajdzie pasującego elementu. Dodatkowo, wzbogaciłeś swoją wiedzę na temat operatora ElementAt, który zwraca element znajdujący się na podanej pozycji. Na końcu, poznałeś operator Single, który służy do zwrócenia wartości, jeżeli ta występuje tylko raz w kolekcji.
W kolejnym artykule nauczymy się, jak wykorzystywać kwantyfikatory.