Ich habe das folgende Szenario, in dem ich einige Elemente zu einer Liste hinzufügen möchte ...
%Vor%Mit diesem Code werden der Liste keine Elemente hinzugefügt, aber wenn ich eine .ToList () nach der Linq-Anweisung hinzufüge, werden die Elemente korrekt hinzugefügt. Ich schätze, das liegt an der verzögerten Ausführung, aber ich hätte gedacht, dass die List.AddRange-Funktion einen IEnumerable akzeptiert, dass sie die hinzuzufügenden Elemente aufzählen würde.
Kann jemand bitte aufklären, warum das passiert?
Danke für die Antworten. Ich habe versucht, den Code für dieses Beispiel zu vereinfachen, aber wie immer ist der Teufel in den Details!
Zwischen der .Where () -Anweisung und dem AddRange () -Aufruf löschte der Code (tief) die Quellenliste ("Elemente" in diesem Beispiel). Der Entwickler erkannte nicht, dass der Filter bis zum Aufruf von AddRange () verschoben wurde, zu welchem Zeitpunkt sie die Quellliste bereits gelöscht hatten.
Gut zu wissen, dass ich die Handlung nicht verloren habe:)
Ich schätze, das liegt an der verzögerten Ausführung, aber ich hätte gedacht, dass die List.AddRange-Funktion einen IEnumerable akzeptiert, dass sie die hinzuzufügenden Elemente aufzählen würde.
Es tut es. Es gibt einen Kurzschluss für ICollection<T>
(den Sie in diesem Fall nicht treffen würden), was dazu führen würde, dass ICollection<T>.CopyTo
anstatt die Elemente zu nummerieren, ansonsten wird die Auflistung aufgelistet.
Versuchen Sie für ein funktionierendes Beispiel:
%Vor% Dies verwendet Ihren genauen Code und gibt 500 aus (die richtige Anzahl an Elementen in List<T>
).
Es funktioniert. Hier ist ein Komponententest, der es beweist:
%Vor%Vielleicht gibt es etwas in Ihrem speziellen Szenario, das nicht richtig funktioniert.
Tags und Links c# list ienumerable addrange deferred