Чем FirstOrDefault отличается от SingleOrDefault в C#

В C# методы FirstOrDefault и SingleOrDefault используются для извлечения одного элемента из последовательности, но имеют разные правила работы.

FirstOrDefault

Возвращает первый элемент последовательности или значение по умолчанию, если последовательность пуста.

var numbers = new List<int> { 1, 2, 3 };
var first = numbers.FirstOrDefault(); // 1
var emptyList = new List<int>();
var firstEmpty = emptyList.FirstOrDefault(); // 0 (для int, значение по умолчанию)
  • Используется, когда нужен первый элемент.
  • Не выбрасывает исключение, если коллекция пуста.
  • Может быть эффективнее, если порядок важен.

SingleOrDefault

Возвращает единственный элемент последовательности или default, если последовательность пуста. Выбрасывает исключение, если в последовательности больше одного элемента.

var numbers = new List<int> { 42 };
var single = numbers.SingleOrDefault(); // 42
var multipleNumbers = new List<int> { 1, 2, 3 };
var error = multipleNumbers.SingleOrDefault(); // Исключение
  • Используется, когда ожидается единственный элемент.
  • Безопасен для пустых последовательностей, но не для случаев, когда элементов больше одного.
  • Может помочь валидации данных.

Сравнение FirstOrDefault и SingleOrDefault

МетодЕсли коллекция пустаЕсли один элементЕсли больше одного элемента
FirstOrDefaultВозвращает defaultВозвращает элементВозвращает первый элемент
SingleOrDefaultВозвращает defaultВозвращает элементВыбрасывает исключение

Когда использовать

  • FirstOrDefault подходит, если важен порядок элементов или допускается наличие нескольких элементов.
  • SingleOrDefault следует использовать, если гарантируется единственность элемента, например, при поиске по уникальному ключу.

Оба метода полезны, но SingleOrDefault следует применять, когда критична уникальность элемента, а FirstOrDefault — когда достаточно первого найденного значения.