5

数百万個のオブジェクトという非常に大きなIEnumerableコレクションがある場合、一度にすべてをロードするには大きすぎます。コレクションは yield メソッドを介して返されます。

 private static IEnumerable<MyData> ExtractModelsFromDb()
    {
        using (DbDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                Load MyData
                yield return MyData;
            }
            reader.Close();
        }
    }

このデータは、単一のForeachループで消費されます。

public void RunStuff()
    {
        var myCollection = ExtractModelsFromDb();

        foreach (var data in myCollection)
        {
           //DO STUFF 
        }
    }

IEnumerableの下のコレクションが一度に 1 つのオブジェクトをロードしていることはわかっていますが、オブジェクトは で使用されると削除されますか、それともが完了ForEachするまでコレクションに残りますか。ForEach

4

1 に答える 1

5

実装に依存します。が表す順序で値を格納することは、 の仕様に反するものではありません。IEnumerable実際、 aはまさにそれを行うList<T>anです!IEnumerable<T>

今、IEnumerableあなた持っているのは、オブジェクトを返した後にオブジェクトを保存しません。DbDataReaders は結果をストリーミングするだけで、yield returning は結果を保存しません。したがって、あなたforeachは からの結果セットをストリーミングしているだけで、ストリームをゆっくりと下っていくDbDataReaderと、誰もそれらを保存していません。

于 2013-07-26T02:14:02.087 に答える