2016-05-18 11 views
1

Hier ist meine Funktion in der ich verschachtelte Schleifen verwende wie:Code-Effizienz für verschachtelte Schleifen C#

public string HGSearchNew(HolidayFeedService.PackageHolidays.SearchCriteria objsearchcriteria, dynamic search) 
{ 
     XmlDocument xdoc = new XmlDocument(); 
     XmlNodeList ndepartures = xdoc.SelectNodes("Destinations/Departure"); 
     string sFinalDeparture = objsearchcriteria.DepartureAirport.ToUpper(); 

     for (int i = 0; i < objsearchcriteria.DepartureAirport.Split('|').Length; i++) 
     { 

      for (int j = 0; j < ndepartures.Count; j++) 
      { 
       if (objsearchcriteria.DepartureAirport.Split('|')[i].ToUpper() == ndepartures[j]["Name"].InnerText.ToUpper()) 
       { 
        if (!sFinalDeparture.Contains(objsearchcriteria.DepartureAirport.Split('|')[i].ToUpper())) 
         sFinalDeparture += objsearchcriteria.DepartureAirport.Split('|')[i].ToUpper() + "|"; 

        break; 
       } 
      } 
     } 
     return sFinalDeparture; 
    }  

Ich möchte wie anstelle von Schleifen dieser Code effizienter machen, die Verwendung von Inhalt oder irgendwelche Funktionen zum Vergleichen . bitte hilf mir aus?

+9

Sie sollten objsearchcriteria.DepartureAirport.Split speichern '(‚|‘)' innen variabel und diese Variable verwenden stattdessen. Ansonsten ist es seine schreckliche Idee, sich immer wieder auf die gleiche Saite zu spalten. –

+0

@ M.kazem Akhgary danke aber ist es Auswirkungen auf Geschwindigkeit oder Effizienz? –

+1

Beide. Mit der lächerlichen Verschwendung, die du dort hast (gleich mit sFinalDeparture als String, anstatt die Zeichenkette am Ende zu erstellen) verschwendest du nur Speicher und Geschwindigkeit nach links und rechts. – TomTom

Antwort

5

Ich denke, man kann das ganze Verfahren mit diesem lesbar und effizient LINQ Ansatz ersetzen:

public string HGSearchNew(HolidayFeedService.PackageHolidays.SearchCriteria objsearchcriteria) 
{ 
    XmlDocument xdoc = new XmlDocument(); 
    XmlNodeList ndepartures = xdoc.SelectNodes("Destinations/Departure"); 
    string[] departureTokens = objsearchcriteria.DepartureAirport.Split('|'); 

    var matches = ndepartures.Cast<XmlNode>() 
     .Select(node => node.Name) 
     .Intersect(departureTokens, StringComparer.InvariantCultureIgnoreCase); 

    return string.Join("|", matches); 
} 
+0

WHooow. Nett. Und ja, das ist ein Versuch, sich zu kreuzen ... SEHR schön. – TomTom

+0

Eigentlich könnte es schneller sein, alles in der oberen Zeichenfolge zu codieren - Groß-/Kleinschreibung-Vergleiche sind IIRC schneller als Groß-und Kleinschreibung. Nicht sicher, ob es tatsächlich wichtig ist (wie in: es sei denn, es gibt eine Menge Überprüfungen). – TomTom

+0

Abgesehen von der Tatsache, dass Sie die [Türkei Test] (http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html) scheitern können, ist es auch effizienter zu verwenden ' StringComparison' Überladungen von String-Methoden (oder in diesem Fall die 'Intersect'-Überladung, die einen Vergleicher benötigt), weil Sie dem Garbage Collector nicht eine Menge temporärer Strings ('ToUpper') als Nahrung geben. –

Verwandte Themen