No Description

sbakhtina c07da0836e Обновить 'README.md' 10 months ago
ConsoleApp2 dee0edcff4 2nd commit 10 months ago
.gitignore.txt 4b0a6ae650 1st commit 10 months ago
README.md c07da0836e Обновить 'README.md' 10 months ago

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