我会StringBuilder
在这里使用,只是因为它描述了你在做什么。
对于 3 或 4 个字符串的简单连接,它可能不会产生任何显着差异,字符串连接甚至可能会稍微快一些 - 但如果你错了并且有很多行,StringBuilder
将开始变得更有效率,并且它总是更能描述你在做什么。
或者,使用类似的东西:
string html = string.Join("", dv.Cast<DataRowView>()
.Select(rv => rv.Row["X"]));
请注意,您目前在字符串之间没有任何分隔符。你确定那是你想要的吗?(另请注意,您的代码目前没有多大意义 - 您没有i
在循环中使用。为什么?)
我有一篇关于字符串连接的文章,其中更详细地说明了为什么值得使用StringBuilder
以及何时使用。
编辑:对于那些怀疑字符串连接可以更快的人,这里有一个测试 - 故意“讨厌”数据,但只是为了证明它是可能的:
using System;
using System.Diagnostics;
using System.Text;
class Test
{
static readonly string[] Bits = {
"small string",
"string which is a bit longer",
"stirng which is longer again to force yet another copy with any luck"
};
static readonly int ExpectedLength = string.Join("", Bits).Length;
static void Main()
{
Time(StringBuilderTest);
Time(ConcatenateTest);
}
static void Time(Action action)
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
// Make sure it's JITted
action();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
{
action();
}
sw.Stop();
Console.WriteLine("{0}: {1} millis", action.Method.Name,
(long) sw.Elapsed.TotalMilliseconds);
}
static void ConcatenateTest()
{
string x = "";
foreach (string bit in Bits)
{
x += bit;
}
// Force a validation to prevent dodgy optimizations
if (x.Length != ExpectedLength)
{
throw new Exception("Eek!");
}
}
static void StringBuilderTest()
{
StringBuilder builder = new StringBuilder();
foreach (string bit in Bits)
{
builder.Append(bit);
}
string x = builder.ToString();
// Force a validation to prevent dodgy optimizations
if (x.Length != ExpectedLength)
{
throw new Exception("Eek!");
}
}
}
我的机器上的结果(用 编译/o+ /debug-
):
StringBuilderTest: 2245 millis
ConcatenateTest: 989 millis
我已经运行了几次,包括颠倒测试的顺序,结果是一致的。