Ошибка «Collection contains no element matching the predicate» переводится с английского как «коллекция не содержит ни одного элемента, соответствующего предикату» — она возникает в момент вызова методов LINQ вроде First() или Single(), когда условие поиска не совпало ни с одним элементом коллекции. Исключение относится к типу InvalidOperationException и типично для C#, .NET, а также проектов на Unity, где LINQ активно используется для поиска объектов.

Разберёмся, что именно означает это сообщение, почему оно появляется и как исправить ситуацию без потери логики программы. Материал будет полезен как начинающим разработчикам, так и тем, кто столкнулся с ошибкой в чужом коде или в логах игрового движка.

Что означает ошибка: перевод и смысл

Дословный перевод фразы: collection — «коллекция», contains no element — «не содержит ни одного элемента», matching the predicate — «соответствующего предикату». Предикат — это функция-условие, которая возвращает true или false для каждого элемента. В LINQ предикат обычно передаётся как лямбда-выражение, например x => x.Id == 5.

Таким образом, полный смысл сообщения: среди элементов коллекции не нашлось ни одного, для которого заданное условие выполнилось бы. Это не сбой .NET и не повреждение данных — это штатное исключение, которое генерируется самим методом, когда контракт «вернуть элемент» невозможно выполнить.

Стоит отличать эту ошибку от похожей — Sequence contains no elements («последовательность не содержит элементов»). Вторая возникает, когда коллекция вообще пуста и условие даже не проверялось, а первая — именно когда элементы есть, но ни один не подошёл под фильтр.

В каких методах возникает исключение

Ошибка характерна для «строгих» методов LINQ, которые обязаны вернуть элемент и не имеют права вернуть null. К ним относятся:

  • 🔍 First(predicate) — должен вернуть первый подходящий элемент;
  • 🎯 Single(predicate) — должен вернуть ровно один элемент, соответствующий условию;
  • 🔚 Last(predicate) — должен вернуть последний подходящий элемент.

У каждого из этих методов есть «мягкая» пара с суффиксом OrDefault: FirstOrDefault(), SingleOrDefault(), LastOrDefault(). Они в той же ситуации возвращают значение по умолчанию (null для ссылочных типов) вместо генерации исключения.

💡

Ошибка «Collection contains no element matching the predicate» — это не сбой системы, а штатное исключение методов First, Single и Last, когда условие поиска не совпало ни с одним элементом коллекции.