Resharper beschwert sich ständig darüber: Mögliche mehrfache Aufzählung von IEnumerable. Zum Beispiel:ELI5: Wie vermeidet die Konvertierung eines IEnumerable in eine Liste oder ein Array die Leistungseinbußen bei der mehrfachen Aufzählung von IEnumerable?
private int ParseLoanNumber(IEnumerable<string> lines)
{
var loanNumber = 0;
var item = lines.FirstOrDefault(l => l.StartsWith(" LN# 00"));
if (item != null)
{
loanNumber = item.ParseInt(8, 10).GetValueOrDefault();
}
else
{
item = lines.FirstOrDefault(l => l.StartsWith(" LOAN-NO (CONT'D) 00"));
if (item != null)
{
loanNumber = item.ParseInt(19, 10).GetValueOrDefault();
}
}
// Yada yada...
}
Die empfohlene Lösung ist, die enumerable
zu einem list
oder array
und iterieren, dass zu konvertieren.
Das verwirrt mich. Sie werden immer noch etwas aufzählen, und beide Typen (Arrays und Listen) implementieren IEnumerable
. Also, wie löst das irgendetwas, oder verbessern Sie die Leistung in irgendeiner Weise?
Nur um andere Beispiele zu geben; einige 'IEnumerable' sind einfach nicht wiederholbar - zum Beispiel können sie Daten aus einem 'Socket' oder einer externen Quelle zeichnen, wie eine Datenbankabfrage, die einen' IDataReader' umhüllt ("dapper" erlaubt beispielsweise diese Art der Verwendung), oder sie könnten Zahlen aus einem PRNG ziehen usw. –
Also, wenn ich das richtig verstehe, kommt die Leistungseinbuße aus der Nichtumwandlung von * verzögerter Ausführung *. Ist das ungefähr richtig? –