【问题标题】:Does a IEnumerable store objects after useIEnumerable 使用后是否存储对象
【发布时间】:2013-07-26 02:04:47
【问题描述】:

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

【问题讨论】:

    标签: c# performance ienumerable


    【解决方案1】:

    这取决于实现。 违反IEnumerable 的规范以存储它所代表的序列中的值。事实上,List&lt;T&gt; 就是 IEnumerable&lt;T&gt;,它就是这样做的!

    现在,对于拥有的IEnumerable,它在返回对象后将存储这些对象。 DbDataReaders 只是将结果流式传输给您,yield returning 他们不会存储它们。所以,你的foreach 只是从DbDataReader 流式传输结果集,没有人像你go gently down the stream 那样存储它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多