string str = 'my {0} long string {1} need formatting';
我应该做以下事吗,
str = string.Format(str, "really", "doesn't");
或创建类似的方法并调用str = str.ReplaceWithValues("really", "doesn't");
public string ReplaceWithValues(this string str, params object[] values) {
string ret = str;
for (int i = 0; i < values.Length; i++) {
ret = str.Replace(string.Concat("{", i, "}"), values.ToString());
}
return ret;
}
看起来像StringBuilder.AppendFormat()在执行像这样的简单替换时效率不高,因为它通过字符串逐字逐句。
答案 0 :(得分:15)
为什么要重新发明String.Format?
我只是使用框架方法 - 它完全符合你的要求,是健壮的,并且对那些跟随的人有意义......
只是为了满足你的好奇心:
看起来像StringBuilder.AppendFormat()在执行像这样的简单替换时效率不高,因为它通过字符串逐字逐句。
String.Format,FYI,在内部使用StringBuilder.AppendFormat。话虽如此,StringBuilder.AppendFormat非常有效。你提到它通过字符串“逐字符” - 但是,在你的情况下,你正在使用多次调用Replace和Concat。使用StringBuilder单次传递字符串可能要快得多。如果您真的需要知道 - 您可以对此进行分析以进行检查。在我的机器上,如果我同时运行以上1,000,000次,我会得到以下时间:
String.Format - 1029464 ticks
Custom method - 2988568 ticks
答案 1 :(得分:2)
自定义过程将增加每个额外占位符的成本,并为每个中间调用Replace
生成垃圾收集器的一次性字符串。
除了string.Format
比Replace
的多次调用快得多的可能性之外,string.Format
还包括对文化敏感操作的重载。
string.Format
的灵活性和直观性至少与速度一样引人注目。
答案 2 :(得分:1)
如果您只想连接一些字符串,为什么不这样做呢?
string result = "my " + x + " long string " + y + " need formatting";
或
string result = string.Concat("my ", x, " long string ", y, " need formatting");
答案 3 :(得分:0)
在C#中,+运算符实际上是一个string.Concat(),我一直认为String.Format("Hello: {0} {1}", "Bob", "Jones")
是最快的。事实证明,在调试器外部调试样本后,在发布模式下,"Bob" + "Jones"
更快。但是有一个截止点。我相信大约8个串联左右,string.Format变得更快。