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

标签 c# performance ienumerable

如果我有一个非常大的 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 完成。

最佳答案

这取决于实现。它违反 IEnumerable 的规范将值存储在它表示的序列中。事实上,一个List<T>是一个 IEnumerable<T>正是这样做的!

现在,对于 IEnumerable 拥有的,它将不会在返回对象后存储它们。 DbDataReader我们只是将结果流式传输给您,并且 yield return荷兰国际集团不会存储它们。所以,你的 foreach正在流式传输来自 DbDataReader 的结果集,没有人像你一样存储它们 go gently down the stream .

关于c# - IEnumerable 在使用后是否存储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17871727/

相关文章:

c# - 获取 GeometryModel3D 的名称

c# - 与 Java 相比,C# 中的命名约定

c# - 在 C#/.NET 中将值类型作为引用类型传递时如何获得最佳性能?

c# - .NET 循环完整性 101

c# - 使用 LINQ 查找列表中的特定值

c# - 我的模型应该是什么样子?

java - 如何打开 AWT 日志记录

mysql - 插入与现有条目相关的新条目的最快方法是什么?

c# - IQueryable、List、IEnumerator 之间的区别?

c# - 将 List<MyObject> 转换为 IEnumerable<MyInterface>