我在我的代码上运行了Visual Studio分析,发现大量时间都花费在字符串拼接上。有没有更快的方法可以进行字符串拼接?
string[] infoseperated = info.Split(' ');
for (int iii = totalremove; iii < infoseperated.Length; iii++)
{
newinfo += infoseperated[iii] + " ";
}
我在我的代码上运行了Visual Studio分析,发现大量时间都花费在字符串拼接上。有没有更快的方法可以进行字符串拼接?
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's algorithm。
string.Join
在内部使用StringBuilder
来避免这种情况。
infoseparated.Skip(totalremove)
来匹配原帖的语义。 - jasonIList<string>
; 带有起始索引和长度参数的Join
重载可能更有效率。 - phoogSkip
版本更易读,所以这也是一个因素。 - jasonTake(count)
:infoseperated.Skip(totalremove).Take(count)
。 - BrokenGlassString.Join
可能更合适。 - Yaur+
运算符连接字符串时,都会创建一个新的对象。相反,请使用 StringBuilder
类。尝试使用 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();
正如其他许多答案所说,直接或间接地使用 StringBuilder(通过 string.Join)将具有更好的性能。但是,在您的示例 Split & Join 中,我认为我们可以做得更好。
// 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);
String.Join
在这种情况下更好,因为写入的代码更少。 - jasonstring.Join
,string.Append
和 string.Format("")
可能比添加字符串更有效率,然而这并不意味着你一定会提高速度到你真正想要的程度。你应该尝试着看大局,并真正确定为什么你需要如此频繁地连接字符串,如果你可以将这个操作最小化,那么可能比仅仅使用最有效的连接方法好。
其他答案正确地建议使用string.Join
,但他们建议错误的重载:
newInfo = string.Join(" ", infoseparated, totalremove, infoseparated.Length - totalremove);
infoseparated.Skip(totalremove)
дЅњдёєз¬¬дєЊдёЄеЏ‚ж•°дј йЂ’з»™String.Join
гЂ‚ - jasonJoin(string, string[], int, int)
调用可能更好。 - phoogstring newinfo;
while (totalremove-- > 0 && (index = info.IndexOf(' ', index)) >= 0) index+=1;
if (index >= 0)
newinfo = info.Substring(index);
else
newinfo = "";