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一次加载一个对象,但是一旦在 中使用这些对象就会被删除,ForEach或者它们是否保留在集合中直到ForEach完成。

4

1 回答 1

5

这取决于实施。将值存储在它所代表的序列中并不违反规范。IEnumerable事实上,aList<T>正是IEnumerable<T>这样做的!

现在,对于IEnumerable拥有的,它不会在返回对象后存储它们。DbDataReaders 只是将结果流式传输给您,并且yield return它们不会存储它们。因此,您foreach只是从 流式传输结果集,当您轻轻顺流而下时DbDataReader,没有人会存储它们。

于 2013-07-26T02:14:02.087 回答