while
ではありません vs foreach
それが違いを生みます。 .Cast<T>()
の呼び出しです 。
最初のサンプルでは、同じで譲歩しています。 whileループの各反復のオブジェクト。注意しないと、実際にデータを使用する前にyieldイテレータを完了してしまい、DataReaderはすでに破棄されています。これは、たとえば.ToList()
を呼び出す場合に発生する可能性があります このメソッドを呼び出した後。リスト内のすべてのレコードが同じ値を持つことを期待できる最善の方法です。
(上級者向けのヒント:ほとんどの場合、.ToList()
あなたが絶対にしなければならないまで。 IEnumerableレコードのみを操作することをお勧めします。
2番目のサンプルでは、.Cast<T>()
を呼び出すと データリーダーでは、各レコードを反復処理するときにデータのコピーを効果的に作成しています。これで、同じオブジェクトを生成しなくなりました。