C#连接更快
本文关键字:连接 | 更新日期: 2023-09-27 18:28:45
我对代码进行了visualstudio分析,发现连接字符串花费了大量时间。有没有更快的连接方法?
string[] infoseperated = info.Split(' ');
for (int iii = totalremove; iii < infoseperated.Length; iii++)
{
newinfo += infoseperated[iii] + " ";
}
改用string.Join
:
newinfo = string.Join(" ", infoseperated.Skip(totalremove));
您当前的方法为每个串联生成一个新的字符串(因为字符串是不可变的,您必须重新分配一个新字符串),这是非常昂贵的。
对于每一个串联,现有字符串的所有字符都必须复制到新字符串中,因此此操作的成本随着字符串中字符数的增加而增加-这是一个Schlemiel the Painter的算法
CCD_ 2在内部使用CCD_。
您应该看看StringBuilder类。它是为这样的事情准备的。
每次与+
运算符连接时,都会创建一个新对象。相反,请使用StringBuilder
类。
使用System.Text.StringBuilder。它比字符串串联具有更好的性能。
string.Join
、string.Append
和string.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);
// 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 = "";