C#编译器如何使用拆分?

时间:2011-08-23 18:17:26

标签: c# split stringbuilder

我有List<string>我正在迭代并拆分每个项目,然后将其添加到StringBuilder

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

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

6 个答案:

答案 0 :(得分:5)

代码实际上与此相当:

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

所以是的,一个额外的string,表示分割的第二部分和空字符串的串联。

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

您只需Concat()分割结果和空字符串,就可以保存对Append的调用:

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

请注意,如果您只使用字符串文字,那么编译器将为您进行一次优化:

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

实际编译为

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

答案 1 :(得分:4)

每个项目增加3个字符串

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

可能的分配最少的是完全避免所有临时分配,但通常的微观优化警告适用。

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

答案 2 :(得分:3)

你有原始字符串'split' - 1 string

你将'split'拆分为两个 - 2个字符串

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

字符串构建器不会创建新字符串。

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

如果要保存一个字符串,请执行以下操作:

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

答案 3 :(得分: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(" ");
}

答案 4 :(得分:2)

因此,对于列表中的每个值(n,在代码中称为part),您要分配:

  1. x(我假设2)分裂的字符串。
  2. n串联的字符串。
  3. n + 1的大致StringBuilder字符串;可能要少得多。
  4. 所以你最后有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,你将阻止它错误

答案 5 :(得分:1)

可能唯一能确定如何编译它的方法是构建它并使用Refactor再次反编译它以查看它是如何在内部处理的。无论如何,请记住它可能对整个应用程序性能没有影响。