【问题标题】:C# String class: No way of pushing a character to the end of the string?C# String 类:无法将字符推到字符串的末尾?
【发布时间】:2015-10-19 06:01:48
【问题描述】:

真的???

我搜索了https://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx 并没有看到任何可以直接将字符推到字符串末尾的方法。我能想到的最好的是

mystr.Insert(mystr.Length, newchar.ToString()); 

这似乎效率低下,因为将字符转换为字符串和执行字符串连接所涉及的开销。我的特定用例看起来像

while (eqtn[curidx] >= '0' && eqtn[curidx] <= '9') istr.Insert(istr.Length, eqtn[curidx++].ToString());

只是因为我想不出更好的方法来做到这一点。有没有更好的办法?

【问题讨论】:

  • 字符串是不可变的。每次你操作一个试图改变它的字符串时,你最终都会创建一个新字符串。
  • 使用StringBuilder

标签: c# string optimization


【解决方案1】:

.NET 中的字符串是不可变的,因此您的代码不会做任何事情。 String 上的每个方法都会创建一个新实例,它不会修改现有字符串。

String 类覆盖 + 运算符以创建一个新字符串,并将字符附加到末尾:

istr = istr + eqtn[curidx++];

如果您正在执行大量此类操作,则使用StringBuilder 会更有效。它基本上是一个可变的String

您可以使用Append 方法在结尾添加一个字符。准备好后,调用ToString 获取构造好的字符串。

【讨论】:

    【解决方案2】:

    是的,这是绝对正确的:您不能将字符推到 string 的末尾,因为 C# 字符串是不可变的。一旦你有了一个对象,在你创建一个新的 string 对象之前,你就会被它的值所束缚。

    另一方面,创建一个末尾带有额外字符的新字符串非常简单:使用执行连接+运算符重载:

    string s = "abc";
    s += '9'; // s becomes "abc9"
    

    请注意,此解决方案不太适合在循环中使用,因为如果您的循环运行 N 次,您会在该过程中创建 N 个一次性对象。更好的解决方案是使用StringBuilder,它在C# 中提供了一个可变 字符串。 StringBuilder 类有一个方便的Append 方法,它将字符推到StringBuilder 的末尾。完成构建字符串后,调用 ToString 将结果作为不可变的 string 对象收集。

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2021-10-04
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多