2010-10-19 169 views
2

我有全局声明的字符串变量。我必须根据用户输入动态地将一个子字符串附加到这个字符串。为此,我使用str = str + substring;字符串操作

在这种情况下,str中的字符串没有意义的句子最后即,有之间没有空格words.to让它感觉到我用下面的语句代替,

海峡= STR +”“+子;或者str = str + substring +“”;

在这里,每次我必须追加额外的空间到子串,然后再附加到主串,需要额外的字符串处理。

任何人都可以帮助我做到这一点吗?

回答

6

这取决于你多久做一次。如果这是间歇性的(或者实际上非常多 - 除了紧密的循环之外的任何事情),那么就忘记它;你有什么是好的。 当然偶尔会产生一个额外的字符串(合并子字符串/空格),但它会在第0代收集;非常便宜。

如果你这样做是积极(在一个循环等),然后用StringBuilder代替:

// declaration 
StringBuilder sb = new StringBuilder(); 
... 
// composition 
sb.Append(' ').Append(substring); 
... 
// obtaining the string 
string s = sb.ToString(); 

最后一个(无关)点 - 再“全球” - 如果你的意思是static,你如果您有多个线程可能想要同步访问。

+1

如果你只是偶尔连接几个字符串,由于构建它的代价,StringBuilder可能会过度杀伤。过去习惯于使用字符串构建器来连接字符串,以避免由于必须完成的字符串复制而导致的最坏情况的二次复杂性,但是更新的C#编译器显然变得足够聪明,可以将字符串连接链变成String.Concat调用使整个操作在线性时间内完成。 – Stewart 2010-10-19 06:32:45

+1

@斯特沃特 - 长久以来一直如此,但只适用于单一的陈述;此外,我已经在这里强调了两种不同的场景(基于频率) – 2010-10-19 06:43:45

+0

哦,是的 - 我没有正确阅读第一句话。感谢您的确认。我认为这是值得说明的。在很多地方,仍然认为应该避免字符串连接,以至于在任何地方都可以使用StringBuilder,即使StringBuilder可能要贵得多。正如你所说,即使一段时间以来它一直没有成立,但二次复杂性的原因总是被引用。 – Stewart 2010-10-19 07:43:57

3

你想要达到什么目的?你可以存储词语列表

List<string> words = new List<string>(); 
... 
words.Add(str); 

然后延迟字符串操作,直到在最后(即添加单词之间的空格)。这样,您即将进行的操作只是添加到列表中,您可以在最后执行所有复杂的处理(无论它是什么)。

+0

(+1)。在这种情况下,我们可以使用类似'String str = words.Aggregate((X1,X2)=> X1 +“”+ X2)的聚集函数来构建最终的'string';' – 2010-10-19 05:38:02

+0

@Pramodh:我想是这样,但为什么我们想要? – 2010-10-19 05:59:34

+0

@ Steven Sudit:'因为这里mrnye将字符串添加到列表中。所以这个列表将会包含'str','Substring1','substring2' ....但是Nanda需要一个单独的字符串(据我所知) – 2010-10-19 06:03:17

0

@南达:在你的情况下,你应该使用字符串生成器。

StringBuilder data = new StringBuilder(); 
data.AppendFormat(" {0}", substring); 
+0

如果你关心性能,你应该避免这种情况。你的代码必须在运行时解析格式字符串,这有成本。杰米和马克的答案会比这更快。 – Stewart 2010-10-19 06:29:09

1

如果你是,你稍微靓起来的代码做很少能这样做:

str += " " + substring; 

否则,我会与南大的解决方案去。