Hier ist der Code der SingleOrDefault Funktion extrahiert:Optimierung in der SingleOrDefault Funktion von 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();
}
Ich frage mich, zu wissen, ob es einen Grund gibt, warum nach dem in der Schleife mehr als ein Element zu finden, da ist keine break-Anweisung, die das Schleifen der restlichen Liste verhindert. In jedem Fall wird ein Fehler auftreten. Für eine große Liste, wo am Anfang mehr als ein Artikel gefunden wird, denke ich, würde es einen Unterschied machen.
Wo erhalten Sie den Code? Dekompilierte? –
Wenn Sie sich ansehen, dass die Überladung kein Prädikat verwendet, werden Sie sehen, dass sie für IList optimiert ist und nur zwei Elemente enthält. Ich nehme an, der Fehlerfall ist nicht wichtig zu optimieren – adrianm
@HamletHakobyan Ja, ich habe Resharper verwendet. – Samuel