Поиск…


Вступление

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;

Когда приведенный выше код компилируется и выполняется, он производит следующий результат: введите описание изображения здесь



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow