替代多个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", @"[/:]", "-");