← Назад к вопросам

Для чего нужен LINQ?

1.3 Junior🔥 121 комментариев
#C# и ООП#Коллекции и структуры данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

LINQ: Language Integrated Query

LINQ — это встроенная в C# синтаксическая конструкция для работы с коллекциями данных единообразным способом. Это один из самых мощных инструментов C#, который упрощает написание и понимание кода при работе с массивами, списками, базами данных и другими источниками данных.

Зачем нужен LINQ?

1. Единообразный синтаксис для разных источников

LINQ позволяет писать один и тот же код для работы с разными типами данных:

// С массивом
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Where(n => n > 2).ToList();

// С базой данных (LINQ to SQL)
var users = dbContext.Users.Where(u => u.Age > 18).ToList();

// С XML (LINQ to XML)
var elements = doc.Descendants("item").Where(el => el.Value != null);

// Синтаксис одинаков, источник не важен

2. Замена для циклов и условий

Вместо многострочных циклов пишем одну строку:

// Плохо: без LINQ
List<int> evenNumbers = new List<int>();
foreach (var num in numbers) {
    if (num % 2 == 0) {
        evenNumbers.Add(num);
    }
}

// Хорошо: с LINQ
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();

3. Функциональный стиль программирования

LINQ позволяет использовать функциональный подход с цепочками методов:

var gameObjects = FindObjectsOfType<GameObject>()
    .Where(go => go.CompareTag("Enemy"))
    .OrderBy(go => Vector3.Distance(go.transform.position, transform.position))
    .Take(5)
    .ToList();

Основные методы LINQ

Фильтрация и поиск:

  • Where() — фильтр по условию
  • First(), FirstOrDefault() — первый элемент
  • Find() — поиск элемента
  • Distinct() — убрать дубликаты

Трансформация:

  • Select() — преобразование каждого элемента
  • SelectMany() — развернуть вложенные коллекции

Сортировка:

  • OrderBy(), OrderByDescending()
  • GroupBy() — группировка

Агрегация:

  • Count() — количество элементов
  • Sum(), Average(), Max(), Min()
  • Any() — проверка наличия
  • All() — проверка всех

Примеры в Unity

// Найти враги с наименьшим здоровьем
var weakestEnemies = enemies
    .Where(e => e.health < 30)
    .OrderBy(e => e.health)
    .Take(3)
    .ToList();

// Подсчитать деньги в инвентаре
int totalMoney = inventory
    .Where(item => item.type == ItemType.Currency)
    .Sum(item => item.amount);

// Группировать предметы по типу
var itemsByType = inventory.GroupBy(item => item.type);

// Проверить, есть ли враги рядом
bool hasNearbyEnemies = enemies.Any(e => Vector3.Distance(e.pos, player.pos) < 10);

Производительность

ВАЖНО: LINQ работает лениво (lazy evaluation). Запрос не выполняется, пока вы не вызовете ToList(), First(), Count() и т.д.

// Запрос не выполнен
var query = numbers.Where(n => n > 5);

// Запрос выполнился здесь
var list = query.ToList();

В Unity избегай LINQ в Update() — это создаёт garbage (мусор для сборщика мусора). Кэшируй результаты.

Выводы

LINQ делает код более читаемым, безопаснее (нет ошибок с индексами) и более выразительным. Это необходимый навык для профессионального разработчика на C#.

Для чего нужен LINQ? | PrepBro