2011-08-23 39 views
0

我有一个List<string>,我正在迭代并分割每个项目,然后将其添加到StringBuilderC#编译器如何与分割一起工作?

foreach(string part in List) 
{ 
    StringBuilder.Append(part.Split(':')[1] + " "); 
} 

所以我的问题是有多少字符串是通过做这个拆分创建的?所有的分割都会产生两个项目。所以......我在想它会创建一个string[2]然后是一个空字符串。但是,它是否创建了string[1] + " "的连接,然后将其添加到StringBuilder或者这是优化的吗?

+1

用ILDASM或Reflector检查出来。 –

回答

5

的代码实际上相当于此:

foreach(string part in myList) 
{ 
    sb.Append(string.Concat(part.Split(':')[1], " ")); 
} 

所以是,附加string,表示分割和空字符串的第二部分的级联将被创建。

包括原始文件string,您还可以通过调用Split()创建两个文件,并且引用文字字符串" ",该文件将从程序集元数据中加载。

您可以通过只Append调用保存自己Concat()荷兰国际集团的拆分结果,并为空字符串顺序:

sb.Append(part.Split(':')[1]).Append(" "); 

请注意,如果你只使用字符串常量,那么编译器会让一个optimzation为您提供:

sb.Append("This is " + "one string"); 

实际上被编译到

sb.Append("This is one string"); 
3

你有原始字符串“分裂” - 1串

你的“分裂”分裂成两个 - 2串

你有分裂的两个部分连接 - 1串

字符串生成器不会创建新的字符串。

当前代码使用4个字符串,包括原始字符串。

如果你想保存一个字符串做:

StringBuilder.Append(part.Split(':')[1]); 
StringBuilder.Append(" "); 
1

也许只有这样,才能知道这是如何编译是建立它与重构重新编译它,看看它是如何进行内部处理。无论如何请记住,它可能不会影响整个应用程序的性能。

2

此代码:

foreach(string part in List) 
{ 
    StringBuilder.Append(part.Split(':')[1] + " "); 
} 

等同于:

foreach(string part in List) 
{ 
    string tmp = string.Concat(part.Split(':')[1], " "); 
    StringBuilder.Append(tmp); 
} 

所以,是的,它是不必要创建一个字符串。这将是更好的,至少在生成的字符串的数量而言:你分配

foreach(string part in List) 
{ 
    StringBuilder.Append(part.Split(':')[1]) 
       .Append(" "); 
} 
2

所以对于列表中的每个值(n,在你的代码被称为part):

  1. x(我假设2)字符串的分裂。
  2. n串联字符串。
  3. 粗略地n + 1字符串为StringBuilder;虽然可能少得多。

所以,你必须nx + n + n + 1末,并假设分裂总是导致两个值4n + 1。改善这种

一种方法是:

foreach(string part in List) 
{ 
    var val = part.Split(':')[1]; 
    StringBuilder.EnsureCapacity(StringBuilder.Length + val.Length + 1); 
    StringBuilder.Append(val); 
    StringBuilder.Append(' '); 
} 

这使得3n + 1。这是一个粗略的估计,因为StringBuilder会在空间不足的情况下分配字符串 - 但是如果您使用EnsureCapacity,则会阻止其从错误。对于每一个项目

  • part[0];
  • part[1];
  • part[1] + " "

最少的分配可能

4

3个额外的字符串是避免所有的临时拨款完全,但通常的微优化注意事项适用。

var start = part.IndexOf(':') + 1; 
stringbuilder.Append(part, start, part.Length-start).Append(' ');