Det är inte while
kontra foreach
det gör skillnaden. Det är anropet till .Cast<T>()
.
I det första provet ger du efter på samma objekt i varje iteration av while-slingan. Om du inte är försiktig har du slutfört avkastningsiteratorn innan du faktiskt använder data, och DataReader kommer redan att kasseras. Detta kan hända om du till exempel skulle anropa .ToList()
efter att ha anropat den här metoden. Det bästa du kan hoppas på är att varje post i listan har samma värde.
(Proffstips:oftast vill du inte ringa .ToList()
tills du absolut måste. Det är bättre att bara arbeta med IEnumerable records).
I det andra exemplet, när du anropar .Cast<T>()
på dataläsaren gör du i praktiken en kopia av data när den itererar genom varje post. Nu ger du inte längre samma objekt.