方法调用是否需要在foreach循环之前获取数据?

时间:2016-06-01 15:40:20

标签: c# performance foreach

我目前有一段代码片段可以对Active Directory中找到的每个用户采取行动,当我看到它时,我开始怀疑在{{1}之前完成方法调用是否更好}循环或它是否正常。我已经在循环内部和外部使用foreach进行了测试,并且没有注意到差异,但是实际上没有足够大的数据集来查看一个,所以我想从最佳实践情况中更多地了解这一点

principalSearcher.FindAll())

注意:foreach (var user in principalSearcher.FindAll()) { var employeeID = db.Employees .Where(employee => employee.ADUserName == user.SamAccountName && employee.EndDate == null) .Select(employee => employee.ID) .FirstOrDefault(); if (employeeID > 0) { var updatedEmployee = db.Employees.Find(employeeID); updatedEmployee.EndDate = DateTime.Today; db.SaveChanges(); } } 的类型为principalSearcher

1 个答案:

答案 0 :(得分:1)

foreach将被编译为(大致)

//begin decomposition of foreach (var user in principalSearcher.FindAll())

var temp = principalSearcher.FindAll();
var enum = temp.GetEnumerator();
while(enum.MoveNext())
{
    var user = enum.Current;
    // body of foreach block
}
// end decomposition

// local variable outside of foreach
var allPrincipals = principalSearcher.FindAll();


//begin decomposition of foreach (var user in allPrincipals)
var enum = allPrincipals.GetEnumerator();
while(enum.MoveNext())
{
    var user = enum.Current;
    // body of foreach block
}
// end decomposition

因此,无论是否在foreach之外声明变量并使用它,都没有实际意义。

*请注意,我不包含其他工件,如try/finally或cast / boxing,因为它们与问题没有密切关系。