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
}
}