61

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

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

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

4

8 に答える 8

67

「簡単な」代替手段として、StringBuilder を使用するだけです....

StringBuilder sb = new StringBuilder("11223344");

string myString =
    sb
      .Replace("1", string.Empty)
      .Replace("2", string.Empty)
      .Replace("3", string.Empty)
      .ToString();
于 2012-08-17T14:08:12.833 に答える
36

何が起こっているのかを理解するのを難しくする方法を考えていますか?

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

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

于 2012-08-17T14:14:03.947 に答える
27

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

mystring = mystring.Replace("somestring", variable1)
                   .Replace("somestring2", variable2)
                   .Replace("somestring3", variable3); 
于 2012-08-17T14:08:40.597 に答える
15

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

RegEx は、解析、実行、フォーミュレートの 3 つの手順を実行します。ただしString.Replace、ハードコーディングされているため、多くの場合、速度が優れています。また、複雑な RegEx は、整形式の一連のReplaceステートメントほど読みやすくありません。( JonathanのソリューションとDanielのソリューションを比較してください)

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

ただし、時期尚早に最適化しないでください。どの開発者も、3 ミリ秒高速に実行される謎めいたスパゲッティの山よりも読みやすさと保守性を好むでしょう。

于 2012-08-17T15:05:48.180 に答える
5

この記事の正規表現: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);
于 2012-08-17T14:45:50.220 に答える
4

データがどのように編成されているか (何を置き換えるか) またはいくつあるかによって異なります。配列とループは良いアプローチかもしれません。

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

foreach (string curr in replaceThese)
{
    data = data.Replace(curr, string.Empty);
}
于 2012-08-17T14:10:35.017 に答える
4

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);
于 2015-07-09T09:17:13.847 に答える
1

私が好む方法は、 のパワーを使用しRegexて複数置換の問題を解決することです。このアプローチの唯一の問題は、string置き換えるものを 1 つしか選択できないことです。

以下は、有効なファイル名を作成するために all'/'または':'aを置き換えます。'-'

Regex.Replace("invalid:file/name.txt", @"[/:]", "-");
于 2014-11-14T18:28:01.640 に答える