Второе не работает для типов значений, не допускающих значения NULL ( Редактировать: , как вы и предполагали - пропустили это в первый раз) и на самом деле не имеет альтернативы, кроме первого, в котором есть раса-состояние.Есть две альтернативы, которые подходят обе - выбор одной или другой зависит от того, как часто вы получите пустую последовательность.
Если это обычный или ожидаемый случай, когда вы получаете пустое перечисление, используя foreach
цикл относительно аккуратный:
foreach (var firstItem in collection)
{
// add logic here
break;
}
или если вы действительно не хотите там break
(что понятно):
foreach (var firstItem in collection.Take(1))
{
// add logic here
}
Если это относительно необычно для негочтобы быть пустым, тогда блок try/catch
должен обеспечивать наилучшую производительность (поскольку исключения являются дорогостоящими, только если они действительно возбуждаются - исключение без возмещения практически бесплатное):
try
{
var firstItem = collection.First();
// add logic here
}
catch (InvalidOperationException) { }
Третьим вариантом является использованиенепосредственно перечислитель, хотя это должно быть идентично версии foreach
и немного менее понятно:
using (var e = collection.GetEnumerator())
{
if (e.MoveNext())
{
var firstItem = e.Current;
// add logic here
}
}