Dziś przedstawie podstawy LINQ w .NETcie. Nie ma potrzeby pisać dokładnie co to jest, jak działa, bo na dowolnej stronie poświęconej LINQ można to wyczytać. Bardzo istotną rzeczą jest zrozumienie o co w tym wszystkim chodzi.
Cała zabawa z LINQ polega na wywoływaniu metod/funkcji, aż do osiągnięcia interesuącego nas rezultatu (oczywiście nie jest to całkowita prawda, lecz w tym pierwszym poście wszystko upraszczamy). Schemat działania wygląda mniej więcej tak:
Dane wpadają do metody, która coś z nim robi, następnie wynik przekazuje innej metodzie itd. aż do zakończenia. Można to sobie wyobrazić, iż to działa na zasadzie sekwencji: A -> B -> C -> Wynik
Zobaczmy prosty przykład. Chcemy wygenerować 1000 elementową kolekcję. Bez użycia LINQ zrobilibyśmy zwykłą pętle for z granicą < 1000. To za dużo pisania, wystarczy to zrobić w tak:
Enumerable.Range(0, 1000)
Tak na marginesie w języku ruby (który też zawiera elementy programowania funkcyjnego) bardzo mi się podoba zapis:
5.times {|i| p i}
Znaczy, że to jest w klamrach (bloku) wykona się 5 razy. W csharpie ten sam efekt możemy właśnie osiągnąć przez:
Enumerable.Range(0, 10000000).ToList().ForEach(Console.WriteLine)
Jak widać ruby w tym przypadku (i nie tylko) jest bardzo zwięzły, ale nie o tym języku miało być dzisiaj.. ale wracając do LINQ. Microsoft dał .NETowcom, bardzo potężne i szybkie narzędzie to operacji na wszelakiego rodzaju kolekcjach.
1) Aby wyciągnąć maksymalny element w tablicy wystarczy użyć:
listaIntow.Max(); // jeśli lista zawiera same inty
listaUserow.Max(user => user.Id); // tablica zawiera użytkowników, Max zwróci usera z największym ID
2) Suma:
listaIntow.Sum();
listaUserow.Max(user => user.Id); // suma id
3) Ilość
listaIntow.Count();
listaUserow.Count();
4) Średnia
listaIntow.Average();
listaUserow.Average(user => user.Id); // średnia ze wszystkich wartości user ID
5) Minimum
identycznie jak Max
6) Sortowanie
listaIntow.OrderBy(); // OrderByDescending
listaUserow.OrderBy(user => user.Id); // OrderByDescending(user => user.Id);
LINQ daje nam na prawdę ogromne możliwości, nie wspominając już o PLINQ (paraller linq), ale to temat na osobny post.
Wyobraźmy sobie, że chcemy wygenerować liczby parzyste pomnożone przez 2, a następnie wynik chcemy wypisać w konsoli. Bez LINQ musielibyśmy się trochę upisać aby coś takiego osiągnąć.
Enumerable.Rang(0, 1000).Where(x=> x % 2 == 0).Select(x => x * 2).ToList().ForEach(Console.Write);
Mam nadzieję, że zachęciłem osoby, które jeszcze nie znają świata LINQ do zapoznania się z nim bliżej, w następnym poście spróbuję pokazać praktyczne przykłady użycia.
Brak komentarzy:
Prześlij komentarz