Det er ikke while
vs foreach
det gør forskellen. Det er opkaldet til .Cast<T>()
.
I den første prøve giver du efter for det samme objekt i hver iteration af while-løkken. Hvis du ikke er forsigtig, ender du med at have gennemført udbytteiteratoren, før du rent faktisk bruger dataene, og DataReader vil allerede være bortskaffet. Dette kan ske, hvis du for eksempel skulle kalde .ToList()
efter at have kaldt denne metode. Det bedste, du kunne håbe på, ville være for hver post på listen at have den samme værdi.
(Prof tip:det meste af tiden vil du ikke ringe til .ToList()
indtil du absolut skal. Det er bedre bare at arbejde med IEnumerable records).
I det andet eksempel, når du kalder .Cast<T>()
på datalæseren laver du faktisk en kopi af dataene, når de gentager hver post. Nu giver du ikke længere det samme objekt.