Мне было любопытно посмотреть, как метод SingleOrFallback
был реализован в MoreLinq , и обнаружил то, чего раньше не видел:
public static T SingleOrFallback<T>(this IEnumerable<T> source, Func<T> fallback)
{
source.ThrowIfNull("source");
fallback.ThrowIfNull("fallback");
using (IEnumerator<T> iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
return fallback();
}
T first = iterator.Current;
if (iterator.MoveNext())
{
throw new InvalidOperationException();
}
return first;
}
}
Почему IEnumerator<T>
в операторе using
? Об этом следует подумать при использовании foreach
на IEnumerable<T>
также?
Дополнительный вопрос: Что именно делает этот метод? Возвращает ли он запасной элемент всякий раз, когда исходная последовательность не содержит ровно один элемент?