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