C# Language
Linq do obiektów
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:
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:
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:
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:
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:
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: