LINQ i kolekcje obiektów - Wybór elementu z kolekcji  Udostępnij na: Facebook

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ć:

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.

  1. Otwórz plik o nazwie Program.cs
  2. 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);
  1. Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F5)
  2. 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.

  1. 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);
  1. Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F5).
  2. 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.

  1. 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);
  1. Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F5).
  2. 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.

  1. 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);
  1. Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F5).
  2. 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.