foreach循环中的内存使用情况C#

时间:2011-04-18 14:10:31

标签: c# memory loops c#-4.0 foreach

我有一个foreach循环

var axsEntities = GetAxsEntitiesForInvoicing(adapter)
                  .GroupBy(x => x.AccountUsingAccountIdToAccountId);

foreach(var gbAccount in axsEntities)
{
    int i = gbAccount.count(); 
}

现在当我在没有循环的情况下运行它时运行正常,但是使用循环它会占用太多内存,在这种情况下为3千兆字节。这可能是什么原因?

由于

5 个答案:

答案 0 :(得分:5)

没有循环,没有任何事情真的发生。

axsEntities只是一个具有延迟执行的IEnumerable 创建它总是很便宜。只有当迭代它(foreach)时才会获取和计算。

所以你可能有很多元素,或.count()使用大量内存。

答案 1 :(得分:0)

我们必须看看axsEntitie的确定类型,但我猜它是IQueryable?如果是这样,没有for循环,你实际上并没有在该集合上做任何。使用for循环,您实际上正在迭代结果集。

答案 2 :(得分:0)

第一个表达式可能是惰性评估的。试试一个简单的

var test = axsEntities.ToList();

看看是否也会占用大量内存。

答案 3 :(得分:0)

问题可能不是forreach循环,而是在循环中执行延迟的GroupBy逻辑。

除非GetAxyEntitiesForInvoicing方法是IQueryable并且不返回所有实体,否则分组必须在内存中进行。

答案 4 :(得分:0)

foreach循环中的gbAccount.count();怎么样?这可能不是一个好主意。我首先检查一下是否负责使用珍贵的内存。我的建议是你可以提出更专业的查询,例如GetAccountsCountForGroupedAxsEntitiesForInvoicingByAccountUsingAccountIdToAccountIdWithSauce,这听起来对我来说真是个好名字。

和平