替代多个String.Replaces
我的代码连续几次使用String.Replace
:
mystring = mystring.Replace("somestring", variable1); mystring = mystring.Replace("somestring2", variable2); mystring = mystring.Replace("somestring3", variable1);
我怀疑有一个更好更快的方法来做到这一点。 你会build议什么?
对于一个“简单”的替代scheme,只需使用一个StringBuilder ….
StringBuilder sb = new StringBuilder("11223344"); string myString = sb .Replace("1", string.Empty) .Replace("2", string.Empty) .Replace("3", string.Empty) .ToString();
我们是否正在想方设法让这个问题更难理解?
如果是这样的正则expression式是你的朋友
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
你至less可以把这些陈述链接起来:
mystring = mystring.Replace("somestring", variable1) .Replace("somestring2", variable2) .Replace("somestring3", variable3);
调用Replace
三次不仅是一个有效的答案,它可能是首选:
RegEx需要三个步骤: parsing,执行,制定 。 但是String.Replace
是硬编码的,所以在很多情况下它有很好的速度。 而一个复杂的正则expression式不像可以正确格式化的Replace
语句链那样可读。 (比较乔纳森对丹尼尔的解答)
如果你仍然不相信你的情况更好,请参加比赛! 同时使用这两种方法,并使用Stopwatch
来查看您使用数据时保存的毫秒数。
但是不要优化你的代码,除非你需要! 任何开发人员都会更喜欢可读性和可维护性,而不是一堆意大利式细面条,它的速度要快3毫秒。
本文正则expression式:用C#replace多个string可以有所帮助:
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);
取决于数据的组织方式(你正在replace的)或者你有多less; 一个数组和循环可能是一个好方法。
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
的力量来解决多重replace问题。 这种方法唯一的问题是你只能select一个string
来replace。
以下将用'-'
replace所有的'/'
或':'
'-'
来创build一个有效的文件名。
Regex.Replace("invalid:file/name.txt", @"[/:]", "-");