2009-04-13 7 views
1

テンプレートファイルで差し込み印刷のような機能を実行するユーティリティメソッドを作成しようとしています。文字列は不変なので、正しく書いたかどうかは不明です。誰かが一目見てフィードバックをくれますか?私のメソッドを最適化する

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

メモリの使用量またはパフォーマンスを最適化しますか? –

+0

効率。私はJaredParのアプローチを使用しています。 –

+0

すべてのキーに同じプレフィックスが付いていますか?分割し、各部分文字列を調べ、必要に応じて置換してから結合します。ネストされたキーには複数のパスが必要です。 –

答えて

4

あなたはディスク

  • からファイルを読む
    1. しようとしているようですが、それはだ場合は、検索/置換して、名前/値のマップ上

    をもとくださいに見えますcase then yesこれはうまくいくでしょう。

    私が持っている唯一のフィードバックは、置き換えられる名前/値のペアの数によっては、一時的な文字列をたくさん作成することです。これはおそらく小さなファイルでは問題ありませんが、比較的大きなファイルをアプリケーションに読み込むと、かなりの違いが見られるかもしれません。

    より良いアプローチは、StringBuilderを使用し、そのオブジェクトに対してReplace呼び出しを行うことです。それは一時的な文字列の不必要な作成を減らすでしょう。

  • +0

    私はStringBuilderのReplaceメソッドの使用について考えたことはありません。私がStringBuildersを使用するとき、私は通常最初から文字列を作成しています。説明ありがとう! –

    +0

    コードのない後の回答にマークが付いているのはなぜか分かりませんが、うれしく思います! –

    +0

    @Adam - それは奇妙です - 私はJaredの反応を引き上げ、私はあなたのことを見ませんでした。ごめんなさい! –

    10

    文字列の代わりにStringBuilderを使用する方がよいでしょう。

    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

    StringBuilderを使用する理由はありません。 –

    +0

    StringBuilderの処理は一般的に高速で、内部バッファを保持しているため、中間文字列を作成することができますが、string.Replace()を使用して作成することが保証されます。 –

    +0

    推測していますStringBuilder.ReplaceとString.Replaceの動作が異なっています:つまり文字列を返す文字列と内部的に文字列を変更するStringBuilder –

    1

    文字列の代わりにStringBuilderを使用します。それは私の唯一のアドバイスです。