我的代码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 需要三个步骤:解析、执行、公式化。但是String.Replace
是硬编码的,因此在许多情况下它具有出色的速度。复杂的 RegEx 不如格式良好的Replace
语句链可读。(将Jonathan的解决方案与Daniel的解决方案进行比较)
如果您仍然不相信这Replace
对您的情况更好,那就来一场比赛吧!并排尝试这两种方法,并使用 aStopwatch
查看您在使用数据时节省了多少毫秒。
但不要过早优化!任何开发人员都更喜欢可读性和可维护性,而不是执行速度快 3 毫秒的神秘意大利面条。
本文Regex: replace multiple strings in a single pass with 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
来替换。
以下将替换 all'/'
或':'
用 a'-'
来生成有效的文件名。
Regex.Replace("invalid:file/name.txt", @"[/:]", "-");