【发布时间】:2010-12-30 16:30:21
【问题描述】:
所以...我有这种情况,我有一个 Foreach 循环,该循环遍历复选框列表以检查哪些被选中。对于每个选中的复选框,我必须进行相当长的字符串连接,包括 30 个平均长度为 20 个字符的不同字符串,然后将其作为 HTTP 请求发送出去。 2 个字符串取决于所选复选框的索引/值。
复选框列表的长度也是可变的,具体取决于用户的数据。我会说列表的平均长度是 20,但它可以达到 50-60。所以最坏的情况是执行整个字符串连接 60 次左右。
现在我正在通过“+”运算符进行简单的字符串连接,但我想知道使用 Stringbuilder 是否会更快。当然,这意味着我必须要么在循环中创建一个 Stringbuilder 对象,要么在循环之前创建它并在发出 HTTP 请求后在其末尾调用 Stringbuilder.Remove。
感谢任何人就这个问题分享的任何见解。
编辑
感谢大家的所有回复,所以从我收集的信息来看,我这样做的最佳方法是:
StringBuilder sb = new StringBuilder();
foreach (CheckBox item in FriendCheckboxList)
{
if (item.Checked)
{
sb.Append(string1);
sb.Append(string2);
sb.Append(string3);
.
.
.
sb.Append(stringLast);
SendRequest(sb.ToString());
sb.Length = 0;
}
}
【问题讨论】:
-
我很抱歉,看来我对 Stringbuilder 的理解不够好。那么调用 Stringbuilder.ToString() 会清除 Stringbuilder?
-
没有。将 Length 属性设置为零会清除它。
-
someStringBuilder.length = 0;
-
你可以查看 stackoverflow.com/questions/1612797/…> SO post on Concatenation vs Stringbuilder perforamnce。
-
我对您的问题投了赞成票,但我还想指出您的编辑具有误导性。您使用了“最好的方式”这个短语,它是 A) 主观的和 B) 不正确的。关于 A)更好的措辞将是“普遍同意的方式”。关于 B)在这种情况下“更好”的方法是使用 String.Concat 而不是 StringBuilder,如我提出的答案中所述。答案没有错,StringBuilder 很好。只是要小心声称某些东西是“最好的”,因为通常已经或将要发现实际上更好的东西。
标签: c#