Przetwarzanie kolekcji z Linq to Object cz1
Linq
Linq jest językiem zapytań, który dodaje warstwę abstrakcji pomiędzy różnymi typami danych a obiektami. Zapytania można zapisać na dwa sposoby:
- Składnia zapytań, gdzie zapis linq jest podobny do zapytań SQL-owych, nie mniej jednak dla mnie jest mało intuicyjny i z tego sposobu nie korzystam.
Przykładowe zapytanie
12345// numbers - list liczbIEnumerable<int> filteringQuery =from num in numberswhere num < 3 || num > 7select num; - Fluent Api, ten rodzaj zapisu jest dla mnie dużo bardziej czytelny, do zapisu wykorzystujemy łańcuch metod
1 2 |
// numbers - list liczb IEnumerable<int> filteringQuery = numbers.Where(n=>n<3||n>7); |
Dostępne operacje
Wśród dostępnych operacji chciałbym opisać:
- Wybieranie danych
- Filtrowanie
- Szeregowanie
- Operacje statystyczne
Wybieranie danych
Przez wybieranie danych mam na myśli wybranie elementów enumeracji lub też ich części składowych.
Select oraz SelectMany
Select umożliwia wybranie poszczególnych elementów lub ich odpowiednich przekształceń. Co ważne dla jednego elementu enumeracji możliwe jest pobranie tylko jednego elementu. Inaczej sprawa się ma z SelectMany, gdzie dla pojedynczego elementu wejściowego możemy pobrać większą ilość elementów.
1 2 |
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<double> filteringQuery = numbers.Select(n=>Math.Pow(n,2)); |
W wynikowej kolekcji dostaniemy listę potęg elementów wejściowych.
1 2 3 4 5 6 7 8 9 10 11 |
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> filteringQuery = numbers.SelectMany(n=>GetValues(n)); gdzie private static IEnumerable<int> GetValues(int num) { for (int i = 0; i < num; i++) { yield return i; } } |
Jak widzimy możemy odbierać więcej niż jeden element z każdego elementu wejściowego przy próbie wykonania tej samej operacji dostaniemy komunikat o błędzie. W tym konkretnym przypadku, że nie da się konwertować typu IEnumerable<IEnumerable<int>> na tym IEnumerable<int>.
Skip, SkipWhile
Umożliwia pominięcie elementów z kolekcji. Dla skip pomijamy konkretną liczbę elementów, z kolei SkipWhile potrafi pominąć elementy do momentu, kiedy warunek pominięcia zostanie nie spełniony.
1 2 3 4 5 |
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> filteringQuery = numbers.Skip(2); var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> filteringQuery = numbers.SkipWhile(n=>n < 2); |
W powyższych przykładach pominięte zostaną pierwsze 2 elementy.
Take, TakeWhile
Działają na identycznej zasadzie jak skip, z tą różnicą, że Take i TakeWhile wybierają elementy.
1 2 3 4 5 |
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> filteringQuery = numbers.Take(4); var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> filteringQuery = numbers.TakeWhile(n=>n<4); |
W tych przykładach wybierane są pierwsze cztery elementy.
Cast
Cast umożliwia rzutowanie elementów z kolekcji na inny typ.
1 2 |
var numbers = new List<Objects>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> castQuery = numbers.Cast<int>(); |
Filtrowanie, szeregowanie oraz metody statystyczne opiszę w kolejnych postach. A już dzisiaj zapraszam do zapoznania się z przykładami dostępnymi na moim GitHub-ie https://github.com/Matejkos/BlogProjects/tree/master/LinqObjectOperations
CDN