Вот код извлеченных функций SingleOrDefault:Оптимизация функции SingleOrDefault из Linq
public static TSource SingleOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if (source == null) throw Error.ArgumentNull("source");
if (predicate == null) throw Error.ArgumentNull("predicate");
TSource result = default(TSource);
long count = 0;
foreach (TSource element in source) {
if (predicate(element)) {
result = element;
checked { count++; }
}
}
switch (count) {
case 0: return default(TSource);
case 1: return result;
}
throw Error.MoreThanOneMatch();
}
Я интересно знать, есть ли какая-либо причина, почему после нахождения более одного элемента в петле, там не является инструкцией break, чтобы исключить циклизацию остальной части списка. В любом случае произойдет ошибка. Для большого списка, где в начале найдено более одного элемента, я думаю, что это сделает огромную разницу.
Где вы получите код? Декомпилированный? –
Если вы посмотрите на перегрузку, не используя предикат, вы увидите, что она оптимизирована для IList и использует только два элемента. Я предполагаю, что ошибка не важна для оптимизации – adrianm
@HamletHakobyan Да, я использовал Resharper. – Samuel