Синтаксис запросов
LINQ позволяет писать декларативные запросы к коллекциям.
1using System.Linq;23var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };45// Синтаксис запросов6var evenNumbers = from n in numbers7 where n % 2 == 08 select n;910// Синтаксис методов (то же самое)11var evenNumbers2 = numbers.Where(n => n % 2 == 0);
Основные операции
▸Where — фильтрация
1var adults = people.Where(p => p.Age >= 18);23// С индексом4var indexed = people.Where((p, index) => p.Age >= 18 && index < 5);
▸Select — проекция
1var names = people.Select(p => p.Name);23// Анонимные типы4var projections = people.Select(p => new5{6 p.Name,7 p.Age,8 IsAdult = p.Age >= 189});
▸OrderBy / OrderByDescending
1var sorted = people.OrderBy(p => p.Age);2var sortedDesc = people.OrderByDescending(p => p.Age);34// Многократная сортировка5var multiSorted = people6 .OrderBy(p => p.LastName)7 .ThenBy(p => p.FirstName);
Группировка
1// GroupBy2var grouped = people.GroupBy(p => p.City);34foreach (var group in grouped)5{6 Console.WriteLine($"City: {group.Key}");7 foreach (var person in group)8 {9 Console.WriteLine($" {person.Name}");10 }11}1213// Агрегация в группах14var cityStats = people15 .GroupBy(p => p.City)16 .Select(g => new17 {18 City = g.Key,19 Count = g.Count(),20 AverageAge = g.Average(p => p.Age),21 MaxAge = g.Max(p => p.Age)22 });
Соединения
▸Join
1var result = from p in people2 join d in departments on p.DepartmentId equals d.Id3 select new { p.Name, Department = d.Name };
▸GroupJoin
1var result = departments.GroupJoin(2 people,3 d => d.Id,4 p => p.DepartmentId,5 (d, employees) => new6 {7 Department = d.Name,8 Employees = employees.ToList()9 }10);
Агрегатные функции
1var numbers = new[] { 1, 2, 3, 4, 5 };23int sum = numbers.Sum(); // 154int min = numbers.Min(); // 15int max = numbers.Max(); // 56double avg = numbers.Average(); // 3.07int count = numbers.Count(); // 589// Кастомная агрегация10int product = numbers.Aggregate((a, b) => a * b); // 120
Преобразования
1// ToList / ToArray / ToDictionary2List<int> list = numbers.ToList();3int[] array = numbers.ToArray();4var dict = people.ToDictionary(p => p.Id);56// Cast7var ints = new object[] { 1, 2, 3 };8var casted = ints.Cast<int>();910// OfType11var mixed = new object[] { 1, "two", 3.0 };12var doubles = mixed.OfType<double>(); // [3.0]
Первый / последний / элемент
1var first = numbers.First(); // 12var firstEven = numbers.First(n => n % 2 == 0); // 23var firstOrDefault = numbers.FirstOrDefault(n => n > 100); // default45var last = numbers.Last(); // 106var single = numbers.Single(n => n == 5); // 578var elementAt = numbers.ElementAt(3); // 4
Take / Skip
1var first5 = numbers.Take(5); // [1, 2, 3, 4, 5]2var skip5 = numbers.Skip(5); // [6, 7, 8, 9, 10]3var takeWhile = numbers.TakeWhile(n => n < 5); // [1, 2, 3, 4]4var skipWhile = numbers.SkipWhile(n => n < 5); // [5, 6, 7, 8, 9, 10]
Distinct / Union / Intersect
1var unique = new[] { 1, 1, 2, 3, 3 }.Distinct(); // [1, 2, 3]23var set1 = new[] { 1, 2, 3 };4var set2 = new[] { 2, 3, 4 };5var union = set1.Union(set2); // [1, 2, 3, 4]6var intersect = set1.Intersect(set2); // [2, 3]7var except = set1.Except(set2); // [1]
Заключение
LINQ — это основа функционального программирования в C#. Он позволяет писать чистый, декларативный код для работы с коллекциями. Освоение LINQ критично для эффективной C#-разработки.