2016-06-01 1 views
0

Ich habe derzeit einen Code-Schnipsel, der auf jeden Benutzer in Active Directory reagieren wird und als ich es betrachtete, begann ich mich zu fragen, ob es besser ist, den Methodenaufruf vor der foreach-Schleife zu erledigen oder ob es in Ordnung ist es ist. Ich habe getestet mit principalSearcher.FindAll()) sowohl innerhalb als auch außerhalb der Schleife und kann keinen Unterschied bemerken, aber dann gibt es nicht wirklich einen großen Datensatz zu sehen, so dass ich mich wundere über diese mehr aus einer Best-Practice-Situation.Sollte eine Methode aufrufen, Daten vor einer foreach-Schleife zu erhalten?

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(); 
    } 
} 

Hinweis: principalSearcher vom Typ System.DirectoryServices.AccountManagement.PrincipalSearcher

+1

Es spielt keine Rolle in Bezug auf die Leistung - der einzige Unterschied besteht darin, ob die Ergebnisse außerhalb des Bereichs "foreach" verfügbar sind oder nicht. Das Clal wird nur einmal gemacht. –

+1

Warum denkst du, dass es Unterschiede geben kann? – Evk

+0

@Evk Weil ich nicht weiß, wie eine foreach-Schleife kompiliert wird und ob es am Ende mehrere Aufrufe von AD oder nicht tun würde. Ich dachte, es wäre nicht, aber ich dachte, es wäre schön, 100% zu wissen. – Matthew

Antwort

1

Die foreach wird (grob)

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

gegen

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

erhalten zusammengestellt Egal, ob Sie eine Variable deklarieren außerhalb die foreach und verwenden Sie es oder nicht macht keinen praktischen Unterschied.

* Beachten Sie, dass ich keine anderen Artefakte wie try/finally oder Casting/Boxen enthalten, da sie nicht auf die Frage relevant sind.

+0

Danke für diesen Breakdown, beantwortet es nicht nur meine Frage, es erleuchtet mich darüber, wie die Schleife eingehalten wird, damit ich verstehen kann, dass der Unterling auch arbeitet. – Matthew

Verwandte Themen