web-dev-qa-db-ja.com

複数のString.Replacesの代替

私のコードはString.Replaceを連続して数回使用しています:

mystring = mystring.Replace("somestring", variable1);
mystring = mystring.Replace("somestring2", variable2);
mystring = mystring.Replace("somestring3", variable1);

私はそれを行うより良い、より速い方法があると思う。何を提案しますか?

59
Petter Brodin

「簡単な」代替手段として、単にStringBuilder ....を使用します。

StringBuilder sb = new StringBuilder("11223344");

string myString =
    sb
      .Replace("1", string.Empty)
      .Replace("2", string.Empty)
      .Replace("3", string.Empty)
      .ToString();
63
Rostov

何が起こっているのかを理解するために、これをより難しくする方法はありますか?

もしそうなら正規表現はあなたの友達です

var replacements = new Dictionary<string,string>()
{
   {"somestring",someVariable1},
   {"anotherstring",someVariable2}
};

var regex = new Regex(String.Join("|",replacements.Keys.Select(k => Regex.Escape(k))));
var replaced = regex.Replace(input,m => replacements[m.Value]);

ライブ: http://rextester.com/SXXB8348

32
Jamiec

少なくともステートメントを連鎖させることができます:

mystring = mystring.Replace("somestring", variable1)
                   .Replace("somestring2", variable2)
                   .Replace("somestring3", variable3); 
27
Daniel Hilgarth

Replaceを3回呼び出すことは有効な答えであるだけでなく、推奨される答えかもしれません。

RegExは3つのステップを取ります:Parse、Execute、Formulate。しかし、String.Replaceはハードコーディングされているため、多くの場合、速度が優れています。また、複雑なRegExはReplaceステートメントの適切にフォーマットされたチェーンほど読みやすくありません。 ( ダニエルジョナサン の解と比較)

それでもReplaceがあなたの場合により良いと確信していないなら、それから競争をしてください!両方の方法を並べて試して、Stopwatchを使用して、データの使用時に何ミリ秒節約できるかを確認してください。

しかし、DO N'T必要がない限りコードを最適化してください!Any開発者は、3ミリ秒の高速で実行されるスパゲッティの不可解な山よりも読みやすさと保守性を好みます。

13
4444

この記事 正規表現:1回のパスで複数の文字列をC#に置き換える が役立つ場合があります。

static string MultipleReplace(string text, Dictionary replacements) {
    return Regex.Replace(text, 
        "(" + String.Join("|", adict.Keys.ToArray()) + ")",
        delegate(Match m) { return replacements[m.Value]; }
    );
}

// somewhere else in code
string temp = "Jonathan Smith is a developer";
adict.Add("Jonathan", "David");
adict.Add("Smith", "Seruyange");
string rep = MultipleReplace(temp, adict);
5
Jonathan Prates

データの整理方法(置換対象)または所有しているデータ数に応じて。配列とループは良いアプローチかもしれません。

string[] replaceThese = {"1", "2", "3"};
string data = "replace1allthe2numbers3";

foreach (string curr in replaceThese)
{
    data = data.Replace(curr, string.Empty);
}
4
Matt Razza

RegExを使用したくない場合は、このクラスをプロジェクトに追加してください。
拡張メソッド「MultipleReplace」を使用します。

public static class StringExtender
{
    public static string MultipleReplace(this string text, Dictionary<string, string> replacements)
    {
        string retVal = text;
        foreach (string textToReplace in replacements.Keys)
        {
            retVal = retVal.Replace(textToReplace, replacements[textToReplace]);
        }
        return retVal;
    }
}

その後、次のコードを使用できます。

 string mystring = "foobar";

 Dictionary<string, string> stringsToReplace = new Dictionary<string,string>();
 stringsToReplace.Add("somestring", variable1);
 stringsToReplace.Add("somestring2", variable2);
 stringsToReplace.Add("somestring3", variable1);

 mystring = mystring.MultipleReplace(stringsToReplace);
2
mathijsuitmegen

私の好ましい方法は、Regexの力を使用して、複数の置換問題を解決することです。このアプローチの唯一の問題は、置換するstringを1つだけ選択できることです。

以下は、すべての'/'または':''-'に置き換えて、有効なファイル名を作成します。

Regex.Replace("invalid:file/name.txt", @"[/:]", "-");
1
Isaac Baker