2009-04-13 3 views
1

Ich versuche, eine Hilfsmethode zu erstellen, um Seriendruck-ähnliche Funktionen für eine Vorlagendatei auszuführen. Da Strings unveränderlich sind, bin ich mir nicht sicher, ob ich es richtig geschrieben habe - kann jemand einen Blick darauf werfen und mir Feedback geben?Optimieren meiner Methode

public static string LoadTemplateFile(string fileName, 
             NameValueCollection mergeFields) 
{ 
    string result = System.IO.File.ReadAllText(fileName); 

    if (mergeFields != null) 
    { 
     for (int index = 0; index < mergeFields.Count; index++) 
     { 
      result = result.Replace(mergeFields.Keys[index], 
            mergeFields[index]); 
     } 
    } 

    return result; 
} 
+0

Optimieren Sie die Speicherauslastung oder -leistung? –

+0

Effizienz. Ich verwende JaredPars Ansatz. –

+0

Haben alle Ihre Schlüssel das gleiche, ähnliche Präfix? Teilen Sie es auf, untersuchen Sie dann jede Teilzeichenfolge, ersetzen Sie sie nach Bedarf und fügen Sie sie dann hinzu. Erfordert mehrere Durchgänge für verschachtelte Schlüssel. –

Antwort

4

Es sieht aus wie Sie

versuchen
  1. eine Datei Lesen von der Festplatte
  2. Führen Sie eine Suche/ersetzen, basierend auf einem bereitgestellten Name/Wert-Karte

Wenn das der ist Fall dann ja das wird gut funktionieren.

Die einzige echte Rückmeldung, die ich habe, ist, dass abhängig von der Anzahl der Ersatz Name/Wert-Paare, Sie eine Menge temporäre Zeichenfolgen erstellen werden. Dies ist wahrscheinlich für kleine Dateien gut, aber sobald Sie beginnen, relativ große Dateien in Ihre Anwendung zu laden, können Sie einen beträchtlichen Unterschied feststellen.

Ein besserer Ansatz wäre, einen StringBuilder zu verwenden und die Replace-Aufrufe für dieses Objekt auszuführen. Es würde die unnötige Erzeugung von temporären Strings reduzieren.

+0

Ich habe nie über die Replace-Methode des StringBuilders nachgedacht. Wenn ich StringBuilders verwende, erstelle ich normalerweise einen String von Grund auf neu. Danke für die Erklärung! –

+0

Nicht sicher, warum eine spätere Antwort ohne Code markiert wurde, aber ich bin froh, dass Sie es behoben haben! –

+0

@Adam - das ist merkwürdig - ich habe Jareds Antwort aufgegriffen und ich habe deine nicht gesehen. Es tut uns leid! –

10

Sie würden wahrscheinlich besser einen StringBuilder anstelle einer Zeichenfolge verwenden.

public static string LoadTemplateFile(
    string fileName, NameValueCollection mergeFields) 
{  
    System.Text.StringBuilder result = new System.Text.StringBuilder(
     System.IO.File.ReadAllText(fileName)); 

    if (mergeFields != null) 
    { 
     for (int index = 0; index < mergeFields.Count; index++) 
     { 
      result.Replace(mergeFields.Keys[index], 
            mergeFields[index]); 
     } 
    } 

    return result.ToString(); 
} 
+0

Ich kann keine String-Verkettung darin sehen, warum einen StringBuilder verwenden? –

+0

Weil die Operationen, die einen StringBuilder ausführen, im Allgemeinen schneller sind, da er seinen eigenen internen Puffer beibehält, so dass Sie vielleicht Zwischenstrings erzeugen, während Sie garantiert mit string.Replace() –

+0

ich rate StringBuilder.Replace und String.Replace funktionieren anders: zB: String gibt eine Zeichenkette zurück und StringBuilder ändert intern die Zeichenkette –

1

Verwenden Sie StringBuilder anstelle von Zeichenfolge. das ist mein einziger Rat, sein Weg schneller.