C#连接更快

本文关键字:连接 | 更新日期: 2023-09-27 18:28:45

我对代码进行了visualstudio分析,发现连接字符串花费了大量时间。有没有更快的连接方法?

    string[] infoseperated = info.Split(' ');   
    for (int iii = totalremove; iii < infoseperated.Length; iii++)
    {
    newinfo += infoseperated[iii] + " ";
    }

C#连接更快

改用string.Join

newinfo = string.Join(" ", infoseperated.Skip(totalremove));

您当前的方法为每个串联生成一个新的字符串(因为字符串是不可变的,您必须重新分配一个新字符串),这是非常昂贵的。

对于每一个串联,现有字符串的所有字符都必须复制到新字符串中,因此此操作的成本随着字符串中字符数的增加而增加-这是一个Schlemiel the Painter的算法

CCD_ 2在内部使用CCD_。

您应该看看StringBuilder类。它是为这样的事情准备的。

每次与+运算符连接时,都会创建一个新对象。相反,请使用StringBuilder类。

使用System.Text.StringBuilder。它比字符串串联具有更好的性能。

string.Joinstring.Appendstring.Format("")可能比添加字符串更有效率,但这并不意味着你一定会像你真正想要的那样提高速度,如果您可以最小化该操作,那么它可能比只使用最有效的串联方法要好。

尝试使用StringBuilder:

        StringBuilder sb = new StringBuilder();
        int totalremove = 0;
        string[] infoseperated = info.Split(' ');
        for (int iii = totalremove; iii < infoseperated.Length; iii++)
        {
            sb.Append(infoseperated[iii]);
            sb.Append(" ");
        }
        newinfo = sb.ToString();

其他答案建议string.Join是正确的,但它们建议错误的过载:

newInfo = string.Join(" ", infoseparated, totalremove, infoseparated.Length - totalremove);
正如许多其他答案所说,直接或间接通过字符串使用StringBuilder。加入会有更好的表现。然而,在您的示例Split&加入,我认为我们可以做得更好。
// first, find the n-th (totalremove-th) separating space.
int index = 0;
for(int i = 0; i < totalremove; i++)
{
    index = infoseperated.IndexOf(' ', index + 1);
    if(index == -1) return ""; // e.g., asked to remove 5 values, but only 3 in the string.
}
// return everything after that point.
return infoseperated.Substring(index + 1);

只要infoseparated没有任何双空格,或者开头没有空格,或者诸如此类的东西,这将比拆分&重新组装绳子。

如果性能是最大的问题,那么最快的方法可能是根本不拆分字符串,并且除了获取子字符串之外不会产生内存分配开销;

string newinfo;
while (totalremove-- > 0 && (index = info.IndexOf(' ', index)) >= 0) index+=1;
if (index >= 0)
    newinfo = info.Substring(index);
else
    newinfo = "";