替代多个String.Replaces

Pet*_*din 60 c# string replace

我的代码String.Replace连续多次使用:

mystring = mystring.Replace("somestring", variable1);
mystring = mystring.Replace("somestring2", variable2);
mystring = mystring.Replace("somestring3", variable1);
Run Code Online (Sandbox Code Playgroud)

我怀疑有更好更快的方法.你会建议什么?

Ros*_*tov 64

对于'简单'替代方案,只需使用StringBuilder ....

StringBuilder sb = new StringBuilder("11223344");

string myString =
    sb
      .Replace("1", string.Empty)
      .Replace("2", string.Empty)
      .Replace("3", string.Empty)
      .ToString();
Run Code Online (Sandbox Code Playgroud)

  • 这怎么容易?我看到的唯一好处是它可能会减少对GC的压力. (7认同)
  • @Daniel Hilgarth我的意思是"更容易",实现起来仍然很简单,但将StringBuiler上的替换链接在一起比在常规字符串上调用它更"更快",并且不包括一些Regex解决方案的复杂性如下所列. (5认同)
  • 这似乎是所提出的解决方案中最具可读性的. (2认同)

Jam*_*iec 32

我们是否正在努力让人们更难理解发生了什么?

如果是这样的正则表达式是你的朋友

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]);
Run Code Online (Sandbox Code Playgroud)

直播:http://rextester.com/SXXB8348

  • @Servy - 你提出了所有好处.但是,我的第一句话应该指出这是一种做多次替换的血腥可怕方式. (4认同)
  • 此RegEx解决方案只进行一次通过并正确替换所有项目.在某些情况下(如我的),这是唯一的选项,并且调用.Replace不起作用.为什么?考虑变量1 CONTAINS的情况,部分是字符串"somestring2".然后第二个.Replace结束了你想要替换的第一件东西,等等. (3认同)
  • (不幸的是)这比多次调用string.Replace()慢得多.我也在寻找一种更快的方法来做到这一点; 多次遍历字符串似乎是一种浪费. (2认同)

Dan*_*rth 27

你至少可以链接这些陈述:

mystring = mystring.Replace("somestring", variable1)
                   .Replace("somestring2", variable2)
                   .Replace("somestring3", variable3); 
Run Code Online (Sandbox Code Playgroud)


444*_*444 13

调用Replace三次不仅是一个有效的答案,它可能是首选的答案:

RegEx需要三个步骤:Parse,Execute,Formulate.但它String.Replace是硬编码的,因此在许多情况下它具有优越的速度.复杂的RegEx不像格式良好的Replace语句链那样可读.(比较乔纳森丹尼尔的解决方案)

如果您仍然不相信Replace自己的情况会更好,那么请参加比赛吧!并排尝试这两种方法并使用a Stopwatch来查看使用数据时保存的毫秒数.

除非你需要,否则不要优化你的代码!任何开发人员都会喜欢可读性和可维护性,而不是一堆神秘的意大利面,速度提高3毫秒.


Jon*_*tes 5

本文正则表达式:使用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);
Run Code Online (Sandbox Code Playgroud)

  • 这与Jamiec的回答基本相同,但没有(必需)转义. (2认同)