我目前有一段代码片段可以对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
答案 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,因为它们与问题没有密切关系。