C# IEnumerable是否在使用后存储对象

C# IEnumerable是否在使用后存储对象,c#,performance,ienumerable,C#,Performance,Ienumerable,如果我有一个非常大的IEnumerable集合,以数百万个对象的顺序排列,那就太大了,无法一次加载所有对象。通过收益率方法返回集合: private static IEnumerable<MyData> ExtractModelsFromDb() { using (DbDataReader reader = cmd.ExecuteReader()) { while (reader.Read())

如果我有一个非常大的
IEnumerable
集合,以数百万个对象的顺序排列,那就太大了,无法一次加载所有对象。通过收益率方法返回集合:

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

我知道
IEnumerable
下的集合一次加载一个对象,但是对象在
ForEach
中使用后是否会被删除,或者是否会保留在集合中直到
ForEach
完成。

这取决于实现。按所表示的顺序存储值并不违反
IEnumerable
的规范。事实上,一个
列表
就是一个
IEnumerable
就是这样做的

现在,对于您拥有的
IEnumerable
,它在返回对象后不会存储它们
DbDataReader
s只是将结果流式传输给您,而
yield return
ing不会存储它们。因此,您的
foreach
只是通过
DbDataReader
的结果集进行流式处理,没有人像您一样存储它们

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

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