説明なし

sbakhtina c07da0836e Обновить 'README.md' 8 ヶ月 前
ConsoleApp2 dee0edcff4 2nd commit 8 ヶ月 前
.gitignore.txt 4b0a6ae650 1st commit 8 ヶ月 前
README.md c07da0836e Обновить 'README.md' 8 ヶ月 前

README.md

LINQ


Выберем из массива строки, начинающиеся на определенную букву и отсортируем полученный список

// исходный массив
string[] place = { "Сочи", "Казань", "Мексика", "Москва", "Монголия", "Барселона" };

// список для результатов
var selectedPlace = new List<string>();

foreach (string s in place)
{
    // ищем слова начинающиеся на букву "Б"
    if (s.ToUpper().StartsWith("М"))
        selectedPlace.Add(s);
}

// сортируем получившийся список
selectedPlace.Sort();

foreach (string s in selectedPlace)
    Console.WriteLine(s);
Мексика
Монголия
Москва

Теперь проведем те же действия с помощью LINQ

string[] place = { "Сочи", "Казань", "Мексика", "Москва", "Монголия", "Барселона" };

var selectedPlace = from p in place // определяем каждый объект из place как p
                    where p.ToUpper().StartsWith("М") //фильтрация по критерию
                    orderby p  // упорядочиваем по возрастанию
                    select p; // выбираем объект

foreach (string s in selectedPlace)
    Console.WriteLine(s);
Мексика
Монголия
Москва

Методы расширения LINQ

string[] place = { "Сочи", "Казань", "Мексика", "Москва", "Монголия", "Барселона" };

var selectedPlace = place
    .Where(t => t.ToUpper().StartsWith("М"))
    .OrderBy(t => t);

foreach (string s in selectedPlace)
    Console.WriteLine(s);
Мексика
Монголия
Москва

Фильтрация выборки и проекция


Фильтрация с помощью операторов LINQ

using System;
class Program
{
    static void Main()
    {
        int[] tickets = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        var evens = tickets.Where(ticket => ticket < 7);
        Console.WriteLine("Осталость меньше 7 билетов:");
        foreach (var ticket in evens)
        {
            Console.WriteLine(ticket);
        }
    }

}
Осталость меньше 7 билетов:
1
2
3
4
5
6

Выборка сложных объектов

using System;

class Client
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Client (string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main ()
    {
        List<Client> users = new List<Client>
        {
            new Client("Маша", 18),
            new Client("Алиса", 23),
            new Client("Саша", 30),
            new Client("Вова", 25),
            new Client("Алена", 37)
        };


        var selectedUsers = users.Where(u => u.Age < 30);

        foreach (Client user in selectedUsers)
            Console.WriteLine($"{user.Name} - {user.Age}");
    }
}
Маша - 18
Алиса - 23
Вова - 25

Сложные фильтры


Для создания запроса применяется метод SelectMany

class Client
{
    public string Name { get; set; }
    public int Age { get; set; }
    public List<string> Languages { get; set; }
    public Client()
    {
        Languages = new List<string>();
    }
}
class Progrem
{
    static void Main ()
    {
        List<Client> users = new List<Client>
{
    new Client {
        Name="Тимур",
        Age=23,
        Languages = new List<string> {
            "английский", "немецкий" }},
    new Client {
        Name="Алиса",
        Age=27,
        Languages = new List<string> {
            "английский", "французский" }},
    new Client {
        Name="Дима",
        Age=29,
        Languages = new List<string> {
            "китайский", "испанский" }},
    new Client {
        Name="Катя",
        Age=24,
        Languages = new List<string> {
            "испанский", "немецкий" }}
};

        var selectedUsers = users
             .SelectMany(u => u.Languages,
                (u, l) => new { Student = u, Lang = l })
            .Where(u => u.Lang == "английский" && u.Student.Age < 30)
            .Select(u => u.Student);

        Console.WriteLine("Туристы знающие английский младше 30 лет: ");

        foreach (Client user in selectedUsers)
            Console.WriteLine($"{user.Name} - {user.Age}");
    }
}
Туристы знающие английский младше 30 лет:
Тимур - 23
Алиса - 27

Проекция


Но нам нужен не весь объект, а только его свойство Name

class Client
{
    public string Name { get; set; }
    public int Age { get; set; }
}
class program
{
    static void Main()
    {
        List<Client> users = new List<Client>();
        users.Add(
            new Client { Name = "Саша", Age = 43 });
        users.Add(
            new Client { Name = "Катя", Age = 33 });
        users.Add(
            new Client { Name = "Алена", Age = 24 });

        var names = users.Select(u => u.Name);

        foreach (string n in names)
            Console.WriteLine(n);
    }
}
Саша
Катя
Алена

Аналогично можно создать объекты другого типа, в том числе анонимного

using System;

class Client
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Client(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        List<Client> users = new List<Client>
        {
            new Client("Маша", 18),
            new Client("Алиса", 23),
            new Client("Саша", 30),
            new Client("Вова", 25),
            new Client("Алена", 37)
        };


        var items = users.Select(u => new {
            FirstName = u.Name,
            DateOfBirth = DateTime.Now.Year - u.Age
        });

        foreach (var n in items)
            Console.WriteLine($"{n.FirstName} - {n.DateOfBirth}");
    }
}
Маша - 2006
Алиса - 2001
Саша - 1994
Вова - 1999
Алена - 1987

Переменые в запросах и оператор let


using System;

class Client
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Client(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        List<Client> users = new List<Client>
        {
            new Client("Саша", 30),
            new Client("Вова", 25),
        };


        var people = from u in users
                     let name = "Mr. " + u.Name
                     select new
                     {
                         Name = name,
                         Age = u.Age
                     };
        foreach (var person in people)
        {
            Console.WriteLine($" {person.Name}");
        }
    }
}
 Mr. Саша
 Mr. Вова

Выборка из нескольких источников


class Country
{
    public string Name { get; set; }
}
class Client
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main ()
    {
        List<Client> users = new List<Client>()
        {
            new Client{Name="Антон", Age=45},
            new Client{Name="Вера", Age=23}
        };
        List<Country> countries = new List<Country>()
        {
            new Country
            {
              Name = "Россия"
            },
            new Country
            {
                Name="Австралия"
            },
        };

        var people = from Client in users
                     from Country in countries
                     select new { Name = Client.Name, Country = Country.Name };

        foreach (var p in people)
            Console.WriteLine($"{ p.Name} - {p.Country}");
    }
}
Антон - Россия
Антон - Австралия
Вера - Россия
Вера - Австралия

Сортировка


using System;

class Client
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Client(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        List<Client> users = new List<Client>
        {
            new Client("Маша", 18),
            new Client("Алиса", 23),
            new Client("Саша", 30),
            new Client("Вова", 25),
            new Client("Алена", 37)
        };


        var sortedUsers = users.OrderBy(u => u.Name);

        foreach (Client u in sortedUsers)
            Console.WriteLine(u.Name);
    }
}
Алена
Алиса
Вова
Маша
Саша

Множественные критерии сортировки


using System;

class Client
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Client(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

class Program
{
    static void Main()
    {
        List<Client> users = new List<Client>
        {
            new Client("Маша", 18),
            new Client("Алиса", 23),
            new Client("Саша", 30),
            new Client("Вова", 25),
            new Client("Алена", 37)
        };

        var result = users
            .OrderBy(u => u.Name)
            .ThenBy(u => u.Age);

        foreach (Client u in result)
            Console.WriteLine($"{u.Name} - {u.Age}");
    }
}
Алена - 37
Алиса - 23
Вова - 25
Маша - 18
Саша - 30