2016-06-05 6 views
3

Ich habe diesen Code:Kann ich in forEach eine Überprüfung auf Nulldetails einfügen?

  foreach (var result in results) 
      { 
       if (result.definition != null) 
       { 
        WordForm wordForm = db.WordForms 
         .Where(w => w.Definition == result.definition) 
         .FirstOrDefault(); 

        if (wordForm == null) 
        { 
         wordForm = addWordForm(result, word); 
        } 

        addWordFormExamples(result, word, wordForm); 
        addWordFormSynonyms(result, word, wordForm); 

        db.SaveChanges(); 

       } 
      } 

Gibt es eine Weise, die ich dieses ein .forEach und auch mit durch Zugabe in einer Kontrolle, wenn die Definition als Teil des eigentlichen .forEach null ist, zu sehen optimieren könnte? Ich möchte diesen Code aufräumen und so versuchen, was ich kann, um es weiter zu vereinfachen.

Bitte beachte, dass ich dies bereits zu einem privaten Methode bewegt:

private void processWordForm(Word word, Result result) 
    { 
     WordForm wordForm = db.WordForms 
            .Where(w => w.Definition == result.definition) 
            .FirstOrDefault(); 

     if (wordForm == null) 
     { 
      wordForm = addWordForm(result, word); 
     } 

     addWordFormExamples(result, word, wordForm); 
     addWordFormSynonyms(result, word, wordForm); 

     db.SaveChanges(); 
    } 

So, jetzt brauche ich nur eine ordentliche Art und Weise, diese Methode zu nennen, wenn es einen Weg gibt.

Antwort

3

Sie bekommen alle Ergebnisse vor der foreach Schleife tun und innerhalb der Schleife Sie überprüfen, ob jeder einzelne eine Definition enthält, die nicht null.That ist, bedeutet, dass man eigentlich nur an Ergebnissen interessiert sind, die eine Definition enthalten .

Sie können den Code leicht wieder Faktor, um die Abfrage zu modifizieren, die das results Objekt setzt nur Ergebnisse mit einer definition.This enthält die Notwendigkeit mit der null Prüfung innerhalb der foreach Schleife entfernen.

Etwas wie folgt aus:

var results = sourceOfData.Where(i => e.definition != null).ToList(); 

foreach (var result in results) 
{ 
     WordForm wordForm = db.WordForms 
      .Where(w => w.Definition == result.definition) 
      .FirstOrDefault(); 

     if (wordForm == null) 
     { 
      wordForm = addWordForm(result, word); 
     } 

     addWordFormExamples(result, word, wordForm); 
     addWordFormSynonyms(result, word, wordForm); 

     db.SaveChanges(); 
} 
+0

Wenn zu fragen, den Code zu optimieren, ich glaube nicht, die Verwendung von Where-Methode, dies für Sie tun wird. Es selbst verwendet Schleife (n), um die Dinge herauszufiltern, die es nicht benötigt, was zu einer langsameren Ausführung dieses Codes im Vergleich zu dem Code in der Frage führt. Wo ist die Optimierung? – Adimeus

+0

LINQ to Objects führt eine lineare Traversierung durch. LINQ to Entities übersetzt den Code in eine SQL WHERE.She hat db.SaveChanges() in ihrer Frage, also nehme ich an, dass sie LINQ zu Entities macht, also sollte meine Antwort eigentlich den Code optimieren. Aber selbst wenn es nicht klappt, sieht es immer noch besser aus Indem Sie den Null-Check entfernen und LINQ das für Sie behandeln lassen, sieht der Code viel lesbarer aus. –

Verwandte Themen