Slow foreach () bei einer LINQ-Abfrage - ToList () steigert die Leistung immens - warum ist das so?

Ich verstehe irgendwie das gesamte Konzept der verzögerten Ausführung, aber das Folgende hat mich verwirrt ...

uf einer Datentabelle mit etwa 1000 Zeilen rufe ich @ auAsEnumerable (). Ich wähle dann die Entitäten aus, die in eine IEnumerable von stark typisierten Klassen @ zurückgegeben werde (1) ... Hier bin ich verwirrt: Ich führe eine foreach-Schleife für die Sammlung aus. Auswahl von Sachen aus den einzelnen Elementen in der Sammlung mit einer Reihe vonWo( Anrufe (2) ... und es ist absolut langsam.

DataTable.AsEnumerable().Select(r => new ObjectRepresentation { ... });item.Where(i => i.SomeEnum == SomeEnum.Something)


... aber wenn ich @ anruAuflisten( direkt nach meinemAsEnumerable () Aufrufen der DataTable dauert der Abschluss der foreach-Schleife weniger als eine Sekunde.

Was fehle ich hier? Rufe ich effektivAsEnumerable () jedes Mal, wenn meine Schleife durchläuft? Oder jedes Mal, wenn ich auf ein Objekt in der Sammlung zugreife? Oder jedes Mal, wenn ich ein @ macWo( auf einen Gegenstand in der Sammlung anrufen? Oder all das oben?


Aktualisiere

Etwas vollständiger Code:

public class ObjectRepresentation
{
    public SomeEnum SomeEnum { get; set; }
}


var collection = DataTable.AsEnumerable().Select(r => new ObjectRepresentation
{
    SomeEnum = (SomeEnum)Convert.ToInt32(r["SomeEnum"])
});

foreach(var item in collection) // slow loop
{
    // 10 or so Where() calls on item inside this loop
}

collection = collection.ToList(); // Hit hyper speed button!

foreach(var item in collection) // fast loop
{
    // 10 or so Where() calls on item inside this loop
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage