C# Language
Linq to Objects
Поиск…
Вступление
LINQ to Objects ссылается на использование запросов LINQ с любой коллекцией IEnumerable.
Как LINQ to Object выполняет запросы
Запросы LINQ не выполняются немедленно. Когда вы строите запрос, вы просто сохраняете запрос для будущего выполнения. Только когда вы действительно запрашиваете итерацию запроса, выполняется запрос (например, в цикле for, при вызове ToList, Count, Max, Average, First и т. Д.).
Это считается отсроченным исполнением . Это позволяет вам создавать запрос в несколько этапов, потенциально модифицируя его на основе условных операторов, а затем выполнять его позже только после того, как потребуется результат.
Учитывая код:
var query = from n in numbers
where n % 2 != 0
select n;
В приведенном выше примере сохраняется только запрос в переменной query
. Он не выполняет сам запрос.
Оператор foreach
заставляет выполнить запрос:
foreach(var n in query) {
Console.WriteLine($"Number selected {n}");
}
Некоторые методы LINQ также инициируют выполнение запроса, Count
, First
, Max
, Average
. Они возвращают одиночные значения. ToList
и ToArray
собирает результат и превращает их в список или массив соответственно.
Имейте в виду, что вы можете многократно перебирать запрос по нескольким запросам, если вы вызываете несколько функций LINQ в одном запросе. Это может дать вам разные результаты при каждом вызове. Если вы хотите работать только с одним набором данных, обязательно сохраните его в списке или массиве.
Использование LINQ для объектов в C #
Простой запрос SELECT в 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();
}
В приведенном выше примере массив строк (автомобилей) используется как набор объектов для запроса с использованием LINQ. В запросе LINQ предложение from приходит первым, чтобы ввести источник данных (автомобили) и переменную диапазона (автомобиль). Когда запрос выполняется, переменная диапазона будет служить ссылкой на каждый последующий элемент в автомобилях. Поскольку компилятор может вывести тип автомобиля, вам не нужно указывать его явно
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
SELECT с предложением WHERE
var list = from car in cars
where car.Contains("VW")
select car;
Предложение WHERE используется для запроса массива строк (автомобилей) для поиска и возврата подмножества массива, которое удовлетворяет условию WHERE.
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
Создание упорядоченного списка
var list = from car in cars
orderby car ascending
select car;
Иногда полезно сортировать возвращаемые данные. Предложение orderby приведет к сортировке элементов в соответствии со стандартным компаратором для сортируемого типа.
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
Работа с настраиваемым типом
В этом примере создается типичный список, заполняется, а затем запрашивается
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();
}
}
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
До сих пор примеры не кажутся удивительными, так как можно просто перебирать массив, чтобы сделать в основном то же самое. Однако в приведенных ниже примерах вы можете увидеть, как создавать более сложные запросы с LINQ to Objects и добиваться большего с гораздо меньшим количеством кода.
В приведенном ниже примере мы можем выбрать автомобили, которые были проданы более чем 60000 единиц, и отсортировать их по количеству проданных единиц:
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());
Когда приведенный выше код компилируется и выполняется, он производит следующий результат:
В приведенном ниже примере мы можем выбрать автомобили, которые продали нечетное количество единиц и упорядочить их в алфавитном порядке по имени:
var list = from car in cars
where car.UnitsSold % 2 != 0
orderby car.Name ascending
select car;
Когда приведенный выше код компилируется и выполняется, он производит следующий результат: