В чем разница между методами All и Any в LINQ (C#)?

«В чем разница между методами All и Any в LINQ (C#)?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Методы All() и Any() — это методы расширения LINQ, которые проверяют элементы последовательности на соответствие условию (предикату), но делают это противоположным образом.

  • All(Predicate<T>) возвращает true, если ВСЕ элементы последовательности удовлетворяют заданному условию. Для пустой коллекции возвращает true.
  • Any(Predicate<T>) возвращает true, если ХОТЯ БЫ ОДИН элемент последовательности удовлетворяет заданному условию. Для пустой коллекции возвращает false.

Логическая связь: All(condition) эквивалентно !Any(!condition).

Примеры:

int[] numbers = { 2, 4, 6, 8, 10 };

// All - проверяет, что все числа четные
bool allEven = numbers.All(n => n % 2 == 0); // true

// Any - проверяет, есть ли хотя бы одно число больше 5
bool anyGreaterThanFive = numbers.Any(n => n > 5); // true

// Any - проверяет, есть ли отрицательные числа
bool anyNegative = numbers.Any(n => n < 0); // false

// Особый случай: Any() без предиката
bool collectionIsNotEmpty = numbers.Any(); // true (проверяет, не пуста ли коллекция)

Особенности производительности:

  • Оба метода используют отложенное выполнение и применяют предикат к элементам последовательности до тех пор, пока не будет найден ответ.
  • All остановится на первом элементе, который НЕ удовлетворяет условию, и вернет false.
  • Any остановится на первом элементе, который удовлетворяет условию, и вернет true.

Вывод: Используйте All для проверки глобального требования ко всем элементам. Используйте Any для проверки существования хотя бы одного подходящего элемента.