私のコードはString.Replace
連続して数回使用します:
mystring = mystring.Replace("somestring", variable1);
mystring = mystring.Replace("somestring2", variable2);
mystring = mystring.Replace("somestring3", variable1);
それを行うためのより良い、より速い方法があると思います。何を提案しますか?
「簡単な」代替手段として、StringBuilder を使用するだけです....
StringBuilder sb = new StringBuilder("11223344");
string myString =
sb
.Replace("1", string.Empty)
.Replace("2", string.Empty)
.Replace("3", string.Empty)
.ToString();
何が起こっているのかを理解するのを難しくする方法を考えていますか?
もしそうなら、正規表現はあなたの友達です
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]);
少なくともステートメントを連鎖させることができます:
mystring = mystring.Replace("somestring", variable1)
.Replace("somestring2", variable2)
.Replace("somestring3", variable3);
3 回呼び出すReplace
ことは、有効な回答であるだけでなく、推奨される回答かもしれません。
RegEx は、解析、実行、フォーミュレートの 3 つの手順を実行します。ただしString.Replace
、ハードコーディングされているため、多くの場合、速度が優れています。また、複雑な RegEx は、整形式の一連のReplace
ステートメントほど読みやすくありません。( JonathanのソリューションとDanielのソリューションを比較してください)
Replace
それがあなたのケースにとってより良いとまだ確信していない場合は、それを競争させてください! 両方の方法を並べて試し、 aStopwatch
を使用して、データを使用するときに何ミリ秒節約できるかを確認してください。
ただし、時期尚早に最適化しないでください。どの開発者も、3 ミリ秒高速に実行される謎めいたスパゲッティの山よりも読みやすさと保守性を好むでしょう。
この記事の正規表現: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);
データがどのように編成されているか (何を置き換えるか) またはいくつあるかによって異なります。配列とループは良いアプローチかもしれません。
string[] replaceThese = {"1", "2", "3"};
string data = "replace1allthe2numbers3";
foreach (string curr in replaceThese)
{
data = data.Replace(curr, string.Empty);
}
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);
私が好む方法は、 のパワーを使用しRegex
て複数置換の問題を解決することです。このアプローチの唯一の問題は、string
置き換えるものを 1 つしか選択できないことです。
以下は、有効なファイル名を作成するために all'/'
または':'
aを置き換えます。'-'
Regex.Replace("invalid:file/name.txt", @"[/:]", "-");