Szukaj…


Wprowadzenie

LINQ to Objects oznacza użycie zapytań LINQ z dowolną kolekcją IEnumerable.

Jak LINQ to Object wykonuje zapytania

Zapytania LINQ nie są wykonywane natychmiast. Podczas budowania zapytania po prostu przechowuje się zapytanie do przyszłego wykonania. Tylko wtedy, gdy faktycznie zażądasz iteracji, zapytanie jest wykonywane (np. W pętli for, podczas wywoływania ToList, Count, Max, Average, First itd.)

Jest to uważane za odroczone wykonanie . Pozwala to na zbudowanie zapytania w wielu krokach, potencjalnie modyfikując je w oparciu o instrukcje warunkowe, a następnie wykonując je później, gdy tylko potrzebujesz wyniku.

Biorąc pod uwagę kod:

var query = from n in numbers 
            where n % 2 != 0
            select n;

W powyższym przykładzie zapytanie jest przechowywane tylko w zmiennej query . Nie wykonuje samego zapytania.

Instrukcja foreach wymusza wykonanie zapytania:

foreach(var n in query) {
    Console.WriteLine($"Number selected {n}");
}

Niektóre metody LINQ będą również wyzwalały wykonanie zapytania: Count , First , Max , Average . Zwracają pojedyncze wartości. ToList i ToArray gromadzą wyniki i przekształcają je odpowiednio w List lub Array.

Należy pamiętać, że możliwe jest wielokrotne iterowanie zapytania, jeśli wywołasz wiele funkcji LINQ w tym samym zapytaniu. Może to dać różne wyniki przy każdym połączeniu. Jeśli chcesz pracować tylko z jednym zestawem danych, pamiętaj o zapisaniu go na liście lub tablicy.

Używanie LINQ do obiektów w C #

Proste zapytanie SELECT w Linq

static void Main(string[] args)
{
    string[] cars = { "VW Golf", 
                        "Opel Astra", 
                        "Audi A4", 
                        "Ford Focus", 
                        "Seat Leon", 
                        "VW Passat", 
                        "VW Polo", 
                        "Mercedes C-Class" };

    var list = from car in cars
               select car;

    StringBuilder sb = new StringBuilder();

    foreach (string entry in list)
    {
        sb.Append(entry + "\n");
    }

    Console.WriteLine(sb.ToString());
    Console.ReadLine();
}

W powyższym przykładzie tablica ciągów (samochody) jest używana jako zbiór obiektów, które mają być wyszukiwane za pomocą LINQ. W zapytaniu LINQ klauzula From jest najważniejsza w celu wprowadzenia źródła danych (samochody) i zmiennej zasięgu (samochód). Po wykonaniu zapytania zmienna zakresu będzie służyć jako odniesienie do każdego kolejnego elementu w samochodach. Ponieważ kompilator może wnioskować o typie samochodu, nie trzeba go wyraźnie określać

Gdy powyższy kod zostanie skompilowany i wykonany, daje następujący wynik: wprowadź opis zdjęcia tutaj

WYBIERZ z klauzulą WHERE

var list = from car in cars
           where car.Contains("VW")
           select car;

Klauzula WHERE służy do zapytania o tablicę ciągów (samochody) w celu znalezienia i zwrócenia podzbioru tablicy, który spełnia klauzulę WHERE.

Gdy powyższy kod zostanie skompilowany i wykonany, daje następujący wynik:

wprowadź opis zdjęcia tutaj

Generowanie uporządkowanej listy

var list = from car in cars
           orderby car ascending 
           select car;

Czasami przydatne jest sortowanie zwróconych danych. Klauzula orderby spowoduje, że elementy zostaną posortowane zgodnie z domyślnym programem porównującym sortowany typ.

Gdy powyższy kod zostanie skompilowany i wykonany, daje następujący wynik:

wprowadź opis zdjęcia tutaj

Praca z niestandardowym typem

W tym przykładzie tworzona jest lista wpisywana, wypełniana, a następnie odpytywana

public class Car
{
    public String Name { get; private set; }
    public int UnitsSold { get; private set; }

    public Car(string name, int unitsSold)
    {
        Name = name;
        UnitsSold = unitsSold;
    }
}

class Program
{
    static void Main(string[] args)
    {

        var car1 = new Car("VW Golf", 270952);
        var car2 = new Car("Opel Astra", 56079);
        var car3 = new Car("Audi A4", 52493);
        var car4 = new Car("Ford Focus", 51677);
        var car5 = new Car("Seat Leon", 42125);
        var car6 = new Car("VW Passat", 97586);
        var car7 = new Car("VW Polo", 69867);
        var car8 = new Car("Mercedes C-Class", 67549);

        var cars = new List<Car> { 
            car1, car2, car3, car4, car5, car6, car7, car8 };
        var list = from car in cars
                   select car.Name;

        foreach (var entry in list)
        {
            Console.WriteLine(entry);
        }
        Console.ReadLine();
    }
}

Gdy powyższy kod zostanie skompilowany i wykonany, daje następujący wynik:

wprowadź opis zdjęcia tutaj

Do tej pory przykłady nie wydawały się niesamowite, ponieważ można po prostu iterować tablicę, aby zrobić to samo. Jednak dzięki kilku przykładom poniżej możesz zobaczyć, jak tworzyć bardziej złożone zapytania za pomocą LINQ to Objects i osiągać więcej przy znacznie mniejszym kodzie.

W poniższym przykładzie możemy wybrać samochody, które zostały sprzedane ponad 60000 sztuk i posortować je według liczby sprzedanych jednostek:

var list = from car in cars
           where car.UnitsSold > 60000 
           orderby car.UnitsSold descending 
           select car;

StringBuilder sb = new StringBuilder();

foreach (var entry in list)
{
    sb.AppendLine($"{entry.Name} - {entry.UnitsSold}");
}
Console.WriteLine(sb.ToString());

Gdy powyższy kod zostanie skompilowany i wykonany, daje następujący wynik: wprowadź opis zdjęcia tutaj

W poniższym przykładzie możemy wybrać samochody, które sprzedały nieparzystą liczbę jednostek i uporządkować je alfabetycznie według nazwy:

var list = from car in cars
           where car.UnitsSold % 2 != 0 
           orderby car.Name ascending 
           select car;

Gdy powyższy kod zostanie skompilowany i wykonany, daje następujący wynik: wprowadź opis zdjęcia tutaj



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow