Не е while
срещу foreach
това прави разликата. Това е извикването на .Cast<T>()
.
В първата проба вие отстъпвате на същото обект във всяка итерация на цикъла while. Ако не сте внимателни, в крайна сметка сте завършили итератора на yield, преди действително да използвате данните и DataReader вече ще бъде изхвърлен. Това може да се случи, ако трябва да извикате .ToList()
след извикване на този метод. Най-доброто, на което можете да се надявате, би било всеки запис в списъка да има една и съща стойност.
(Професионален съвет:през повечето време не искате да се обаждате на .ToList()
докато абсолютно трябва. По-добре е просто да работите с IEnumerable записи).
Във втория пример, когато извикате .Cast<T>()
на четеца на данни, вие ефективно правите копие на данните, докато те минават през всеки запис. Сега вече не предоставяте същия обект.