2015-10-18 100 views
0

真的吗?C#字符串类:没有办法将字符推到字符串的末尾?

我已经通过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()); 

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

+2

字符串是不可变的。每当你操纵一个字符串试图改变它,你最终创建一个新的字符串。 – Steve

+2

使用'StringBuilder' – JonE

回答

5

.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对象。

相关问题