Oto kod ekstrakcji funkcji SingleOrDefault:Optymalizacja funkcji 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();
}
Zastanawiam się dowiedzieć, czy istnieje jakikolwiek powód, dlaczego po znalezieniu więcej niż jeden element w pętli, nie nie ma instrukcji break, aby zapobiec zapętleniu reszty listy. W każdym razie wystąpi błąd. W przypadku dużej listy, na której na początku znaleziono więcej niż jeden przedmiot, myślę, że spowodowałoby to różnicę.
Gdzie masz kodu? Dekompilowany? –
Jeśli spojrzysz na przeciążenie, które nie przyjmuje predykatu, zobaczysz, że jest zoptymalizowany pod kątem IList i bierze tylko dwa elementy. Zakładam, że przypadek błędu nie jest ważny dla optymalizacji – adrianm
@HamletHakobyan Tak, użyłem Resharpera. – Samuel