Ответ 1
Согласитесь, что это будет лучше с точки зрения производительности (EDIT: если мы ожидаем, что более одного элемента соответствует нашему предикату, чего мы не должны делать):
foreach (TSource current in source)
{
if (predicate(current))
{
result = current;
num += 1L;
if (num > 1L)
throw Error.MoreThanOneMatch();
}
}
if (num == 0L)
throw Error.NoMatch();
return local;
Похоже, они решили сделать анализ результатов более ясным и отделить его от перечисления источника. Но потом я задаюсь вопросом, почему простой переключатель не использовался:
switch((int)num)
{
case 0: throw Error.NoMatch();
case 1: return local;
default:
throw Error.MoreThanOneMatch();
}
Что касается проблем с производительностью, я думаю, что предполагается, что Single
следует вызывать, когда вы действительно ожидаете одного результата. Нулевые или более результаты - это исключительный путь, который не должен происходить часто (как любое исключение). Таким образом, это скорее ваша ошибка логики программы, если источник содержит много элементов, соответствующих предикату.