Przetwarzanie kolekcji z Linq to Object cz2
W dzisiejszym odcinku zajmiemy się kolejnymi metodami Linq, tym razem do filtrowania danych.
Filtrowanie
Filtrowanie ogranicza ilość naszych danych wynikowych w taki sposób, ażeby spełniały odpowiednie warunki.
Where
Jeśli chcemy ograniczyć wyniki do określonych wartości stosujemy metodę Where.
1 2 |
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> filteringQuery = numbers.Where(n=>n <= 5); |
Możemy również wykorzystać index elementu
1 2 |
var numbers = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; IEnumerable<int> filteringQuery = numbers.Where((n , index)=> n <= 5 || index >8)); |
Distinct
Distinct zwraca nam tylko różne elementy, więc jeśli w naszym zbiorze wystąpią powtórzenia zostaną one pominięte. W wynikowej kolekcji elementy będą w kolejności pierwszych wystąpień danej wartości.
1 2 |
var numbersDuplicated = new List<int>() { 1, 7, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 8, 2, 7 }; IEnumerable<int> filteringQuery = numbersDuplicated.Distinct(); |
OfType
Jeśli w kolekcji mamy elementy różnych typów, a chcemy wybrać tylko te konkretne, możemy wykorzystać metodę OfType<>, która to przefiltruje wyniki po zadanym typie.
1 2 |
var objectsDifferentTypes = new List<object>() { 0, "1", 2, 3.0, 4, "5", 6, 7, 8, 9 }; IEnumerable<int> filteringQuery = objectsDifferentTypes.OfType<int>(); |
Wybieranie specyficznych danych
Linq pozwala również wybrać konkretny element z listy, tak jak gdybyśmy chcieli kolekcję przefiltrować, a następnie wybrać jeden z jej elementów.
Single, SingleOrDefault
Metoda single powinna być wykorzystana, kiedy chcemy zwrócić dokładnie jeden element z naszej kolekcji. Jeśli elementów o zadanych parametrach będzie więcej lub nie będzie ich wcale, nastąpi rzucenie wyjątku. Jeżeli liczymy się z tym, iż odpowiedniego elementu może nie być na naszej liście, możemy wybrać SingleOrDefault, w tym przypadku rzucenie wyjątku nastąpi tylko w momencie, kiedy odpowiednich elementów będzie więcej niż jeden, a jeśli elementu spełniającego kryteria nie będzie zostanie zwrócona wartość domyślna.
1 2 3 4 |
var numbersDuplicated = new List<int>() { 1, 7, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 8, 2, 7 }; int queryValue = numbersDuplicated.Single(n => n == 3); //int queryError = numbersDuplicated.Single(n => n < 0); InvalidOperationException no number below 0 int queryValueDefault = numbersDuplicated.SingleOrDefault(n => n < 0); |
First, FirstOrDefault, Last oraz LastOrDefault
Metody te powinny być wykorzystane, kiedy spodziewamy się większej ilości elementów pasujących do zadanych warunków. First oraz Last w przypadku, kiedy jesteśmy pewni, że taki element istnieje wybierają odpowiednio pierwsze lub ostatnie wystąpienie elementu. W przypadku, kiedy taki element nie istnieje rzucony zostanie wyjątek. FirsOrDefault oraz LastOrDefault działają tak samo jak First oraz Last z tą różnicą, że jeżeli elementu nie będzie, zwrócona zostanie wartość domyślna zamiast wyjątku.
1 2 3 4 5 6 |
var numbersDuplicated = new List<int>() { 1, 7, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 8, 2, 7 }; int queryValueFirst = numbersDuplicated.First(n => n < 6); int queryValueLast = numbersDuplicated.Last(n => n < 6); //or first last element of collection int elementFirst = numbersDuplicated.First(); int elementLast = numbersDuplicated.Last(); |
Po przykłady zapraszam na GitHub-a https://github.com/Matejkos/BlogProjects/tree/master/LinqObjectOperations