LINQ
ʕ•͡-•ʔ
Основы LINQ
Выберем из массива строки, начинающиеся на определенную букву и отсортируем полученный список:
string[] students = {"Женя", "Моисей", "Влада", "Амир", "Маша", "Катя"};
var selectedStudents = new List<string>();
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<Student> users = new List<Student>
{
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<string> Languages { get; set; }
}
class Program
{
static void Main()
{
List<Student> users = new List<Student>
{
new Student { Name = "Арсен", Age = 21, Languages = new List<string> { "английский", "китайский" } },
new Student { Name = "Вася", Age = 24, Languages = new List<string> { "испанский", "японский" } },
new Student { Name = "Глория", Age = 23, Languages = new List<string> { "китайский", "немецкий" } },
new Student { Name = "Стеша", Age = 29, 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 < 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<Student> users = new List<Student>();
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<Student> users = new List<Student>();
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<Student> students = new List<Student>()
{
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<Student> users = new List<Student>()
{
new Student { Name = "Влад", Age = 19 },
new Student { Name = "Влада", Age = 21 }
};
List<Lesson> lessons = new List<Lesson>()
{
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<Student> users = new List<Student>()
{
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<Student> users = new List<Student>()
{
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