LINQ – kilka słów

Language Integrated Query bo takie jest rozwinięcie skrótu LINQ to język zapytań wbudowany w C#. Pozwala on na bardzo wygodne operowanie na danych pochodzących z różnych źródeł (kolekcji, SQL, XML). Dzięki podobieństwu do SQL jest łatwy do opanowania przez osoby znające SQL (tak samo używa Select, Where itp.).
Dzięki LINQ w łatwy sposób możemy filtrować kolekcje według określonych kryteriów, porządkować, grupować itp.
Mając do czynienia z kolekcją obiektów możemy jednym zapytaniem wybrać te, które spełniają określone przez nas kryteria. Możemy to zrobić praktycznie w jednej linijce kodu bez tworzenia skomplikowanych konstrukcji for/if.


Przykłady zamieszczone tutaj opierać będą się na kolekcji obiektów klasy Person (nieśmiertelne rozwiązanie, które oprócz Car z lubością jest stosowane).
Kod klasy Person:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace LINQ
{
    public class Person
    {
        public string Imie { get; set; }
        public string Nazwisko { get; set; }
        public int Wiek { get; set; }
 
        public Person (string imie, string nazwisko, int wiek)
        {
            this.Imie = imie;
            this.Nazwisko = nazwisko;
            this.Wiek = wiek;
        }
 
        public override string ToString()
        {
            string stringOsoba = this.Imie + " " + this.Nazwisko + " " + this.Wiek;
            return stringOsoba.ToString();
        }
    }
}

Tworzymy kolekcję danych – kolekcję obiektów klasy Person:

List<Person> osoby = new List<Person>();

I wypełniamy ją danymi:

    osoby.Add(new Person("Olga", "Lis", 19));
    osoby.Add(new Person("Rafał", "Kieres", 46));
    osoby.Add(new Person("Jan", "Nowak", 24));
    osoby.Add(new Person("Ewelina", "Nidalska", 50));
    osoby.Add(new Person("Marlena", "Pyszna", 19));
    osoby.Add(new Person("Janusz", "Kowalski", 75));
    osoby.Add(new Person("Eleonora", "Jankowska", 50));
    osoby.Add(new Person("Kinga", "Bojarska", 34));
    osoby.Add(new Person("Iza", "Bajorek", 39));
    osoby.Add(new Person("Marek", "Torański", 35));
    osoby.Add(new Person("Adam", "Lisowski", 56));
    osoby.Add(new Person("Michał", "Szynka", 14));
    osoby.Add(new Person("Szymon", "Dudek", 22));

No i teraz mając do dyspozycji kolekcję danych – osoby, możemy operować na niej w celu wyciągnięcia interesujących nas danych.

Jeśli chcemy zobaczyć wszystkie osoby w kolekcji to jak widać nie musimy używać LINQ.

private void ShowAllPersonsUnsorted()
{
    Console.WriteLine("\nOsoby nieposortowane");
    Console.WriteLine("---------------------------");
 
    foreach (var item in osoby)
    {
        Console.WriteLine(item.ToString());
    }
}

Jeśli chcemy zobaczyć wszystkie osoby w kolekcji posortowane po nazwisku to już z pomocą przychodzi nam LINQ (korzystamy z zapisu skróconego).

private void ShowAllPersonsSortedBySurname()
{
    var qry = osoby.OrderBy(n=>n.Nazwisko);
 
    Console.WriteLine("\nOsoby posortowane po nazwisku");
    Console.WriteLine("---------------------------");
 
    foreach (var item in qry)
    {
        Console.WriteLine(item.ToString());
    }
}

No a teraz chcemy posortować naszą kolekcję po wieku od najstarszych do najmłodszych. Też skorzystamy z LINQ z tym, że tym razem dodamy porządek malejący „Reverse()”.

private void ShowAllPersonsSortedByAge()
{
    var qry = osoby.OrderBy(n => n.Wiek).Reverse();
 
    Console.WriteLine("\nOsoby posortowane po wieku - od najstarszych");
    Console.WriteLine("---------------------------");
    foreach (var item in qry)
    {
        Console.WriteLine(item.ToString());
    }
}

Sortujemy naszą kolekcję po imieniu osoby. Tak samo jak poprzednio używamy LINQ. Jak widać sortowanie odbywa się przez użycie „OrderBy” podobnie jak w SQL.

private void ShowPersonsSortedByName()
{
    var qry = osoby.OrderBy(n => n.Imie);
 
    Console.WriteLine("\nOsoby posortowane po imieniu");
    Console.WriteLine("---------------------------");
 
    foreach (var item in qry)
    {
        Console.WriteLine(item.ToString());
    }
}

Kolejnym krokiem niech będzie wyszukanie osób z nazwiskiem dłuższym niż „liczbaZnakow” znaków. Skorzystamy z metody:

private void ShowPersonsWithSurnameLongerThan(int liczbaZnakow)
{
    var qry = osoby.Select(a => a).Where(n => n.Nazwisko.Length > liczbaZnakow);
 
    Console.WriteLine("\nOsoby z nazwiskiem dłuższym niż: {0}", liczbaZnakow);
    Console.WriteLine("---------------------------");
 
    foreach (var item in qry)
    {
        Console.WriteLine(item.ToString());
    }
}
Avatar

Autor: gervee

Pełnoetatowy ojciec małej gromadki, programista(?), "amator" fotograf, "dłubacz" lubiący DIY, miłośnik chmielonego napitku. "Żartowniś" bez poczucia humoru ;).

Dodaj komentarz