# LINQ # ʕ•͡-•ʔ ## Основы LINQ ### Выберем из массива строки, начинающиеся на определенную букву и отсортируем полученный список: ``` string[] students = {"Женя", "Моисей", "Влада", "Амир", "Маша", "Катя"}; var selectedStudents = new List(); foreach(string s in students) { if (s.ToUpper().StartsWith("М")) selectedStudents.Add(s); } selectedStudents.Sort(); foreach (string s in selectedStudents) Console.WriteLine(s); ``` ``` Маша Моисей ``` ### Теперь проведем те же действия с помощью LINQ: ``` string[] students = {"Женя", "Моисей", "Влада", "Амир", "Маша", "Катя"}; var selectedStudents = from t in students where t.ToUpper().StartsWith("М") orderby t select t; foreach (string s in selectedStudents) Console.WriteLine(s); ``` ``` Маша Моисей ``` ## Методы расширения LINQ ``` string[] students = { "Женя", "Моисей", "Влада", "Амир", "Маша", "Катя" }; var selectedStudents = students .Where(t=>t.ToUpper().StartsWith("М")) .OrderBy(t => t); foreach (string s in selectedStudents) Console.WriteLine(s); ``` ``` Маша Моисей ``` ## Фильтрация ### Фильтрация с помощью операторов LINQ: ``` using System; using System.Linq; class Program { static void Main() { int[] grades = { 1, 2, 3, 4, 5, 6, 7 }; var lowGrades = grades.Where(grade => grade < 5); Console.WriteLine("Оценки меньше '5':"); foreach (var grade in lowGrades) { Console.WriteLine(grade); } } } ``` ``` 1 2 3 4 ``` ## Выборка сложных объектов ### Создадим набор студентов и выберем из них тех, которым меньше 23 лет: ``` using System; using System.Collections.Generic; class Student { public string Name { get; set; } public int Age { get; set; } public Student(string name, int age) { Name = name; Age = age; } } class Program { static void Main() { List users = new List { new Student("Влада", 23), new Student("Саня", 19), new Student("Амир", 21), new Student("Маша", 24) }; var selectedUsers = users.Where(u => u.Age <23); foreach (Student user in selectedUsers) { Console.WriteLine($"{user.Name}, - {user.Age}"); } } } ``` ``` Саня, - 19 Амир, - 21 ``` ## Сложные фильтры ### Для создания запроса применяется метод SelectMany: ``` using System; using System.Collections.Generic; using System.Linq; class Student { public string Name { get; set; } public int Age { get; set; } public List Languages { get; set; } } class Program { static void Main() { List users = new List { new Student { Name = "Арсен", Age = 21, Languages = new List { "английский", "китайский" } }, new Student { Name = "Вася", Age = 24, Languages = new List { "испанский", "японский" } }, new Student { Name = "Глория", Age = 23, Languages = new List { "китайский", "немецкий" } }, new Student { Name = "Стеша", Age = 29, Languages = new List { "итальянский", "английский"} } }; var selectedUsers = users .SelectMany(u => u.Languages, (u, l) => new { Student = u, Lang = l }) .Where(u => u.Lang == "китайский" && u.Student.Age < 25) .Select(u => u.Student); Console.WriteLine("Студенты, изучающие китайский младше 25 лет:"); foreach (var user in selectedUsers) { Console.WriteLine($"{user.Name}, возраст: {user.Age}"); } } } ``` ``` Студенты, изучающие китайский младше 25 лет: Арсен, возраст: 21 Глория, возраст: 23 ``` ## Проекция ### нам нужен не весь объект, а только его свойство Name: ``` using System; using System.Linq; class Student { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { List users = new List(); users.Add(new Student { Name = "Мадина", Age = 20 }); users.Add(new Student { Name = "Максим", Age = 23 }); users.Add(new Student { Name = "Макар", Age = 21 }); var names = users.Select(u => u.Name); foreach (string n in names) Console.WriteLine(n); } } ``` ``` Мадина Максим Макар ``` ### можно создать объекты другого типа, в том числе анонимного: ``` using System; using System.Linq; class Student { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { List users = new List(); users.Add(new Student { Name = "Мадина", Age = 20 }); users.Add(new Student { Name = "Максим", Age = 23 }); users.Add(new Student { Name = "Макар", Age = 21 }); 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}"); } } ``` ``` Мадина - 2004 Максим - 2001 Макар - 2003 ``` ## Переменые в запросах и оператор let ``` using System; using System.Linq; class Student { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { List students = new List() { new Student { Name = "Алеша", Age = 19 }, new Student { Name = "Гоша", Age = 22 } }; var people = from u in students let name = "Mr. " + u.Name select new { Name = name, Age = u.Age }; foreach (var person in people) { Console.WriteLine($" {person.Name}"); } } } ``` ``` Mr. Алеша Mr. Гоша ``` ## Выборка из нескольких источников ``` using System; using System.Linq; class Lesson { public string Name { get; set; } } class Student { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { List users = new List() { new Student { Name = "Влад", Age = 19 }, new Student { Name = "Влада", Age = 21 } }; List lessons = new List() { new Lesson { Name = "math" }, new Lesson { Name = "psychology" }, }; var people = from student in users from lesson in lessons select new { Name = student.Name, Lesson = lesson.Name }; foreach (var p in people) Console.WriteLine($"{p.Name} - {p.Lesson}"); } } ``` ``` Влад - math Влад - psychology Влада - math Влада - psychology ``` ## Сортировка ``` using System; using System.Linq; class Student { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { List users = new List() { new Student { Name = "Арсен", Age = 18 }, new Student { Name = "Семен", Age = 29 }, new Student { Name = "Полина", Age = 27 }, new Student { Name = "Кирилл", Age = 21 } }; var sortedStudent = users.OrderByDescending(u => u.Name); foreach (Student u in sortedStudent) Console.WriteLine(u.Name); } } ``` ``` Семен Полина Кирилл Арсен ``` ## Множественные критерии сортировки ``` class Student { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { List users = new List() { new Student { Name = "Амир", Age = 23 }, new Student { Name = "Егор", Age = 30 }, new Student { Name = "Настя", Age = 21 }, new Student { Name = "Анжела", Age = 19 } }; var result = users .OrderBy(u => u.Name) .ThenBy(u => u.Age); foreach (Student u in result) Console.WriteLine($"{u.Name} - {u.Age}"); } } ``` ``` Амир - 23 Анжела - 19 Егор - 30 Настя - 21 ```