私のコードは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);
Replace
を3回呼び出すことは有効な答えであるだけでなく、推奨される答えかもしれません。
RegExは3つのステップを取ります:Parse、Execute、Formulate。しかし、String.Replace
はハードコーディングされているため、多くの場合、速度が優れています。また、複雑なRegExはReplace
ステートメントの適切にフォーマットされたチェーンほど読みやすくありません。 ( ダニエル の ジョナサン の解と比較)
それでもReplace
があなたの場合により良いと確信していないなら、それから競争をしてください!両方の方法を並べて試して、Stopwatch
を使用して、データの使用時に何ミリ秒節約できるかを確認してください。
しかし、DO N'T必要がない限りコードを最適化してください!Any開発者は、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つだけ選択できることです。
以下は、すべての'/'
または':'
を'-'
に置き換えて、有効なファイル名を作成します。
Regex.Replace("invalid:file/name.txt", @"[/:]", "-");