Ответ 1
Я бы использовал StringBuilder
здесь, просто потому, что он описывает, что вы делаете.
Для простой конкатенации 3 или 4 строк это, вероятно, не будет иметь существенных отличий, а конкатенация строк может быть даже немного быстрее - но если вы ошибаетесь и есть много строк, начнется StringBuilder
становится намного более эффективным, и он всегда более подробно описывает, что вы делаете.
В качестве альтернативы используйте что-то вроде:
string html = string.Join("", dv.Cast<DataRowView>()
.Select(rv => rv.Row["X"]));
Обратите внимание, что у вас нет никакого разделителя между строками на данный момент. Вы уверены, что хотите? (Также обратите внимание, что ваш код не имеет большого смысла на данный момент - вы не используете i
в цикле. Почему?)
У меня есть статья о конкатенации строк, которая более подробно описывает, почему стоит использовать StringBuilder
и когда.
EDIT: для тех, кто сомневается, что конкатенация строк может быть быстрее, вот тест - с преднамеренно "скверными" данными, но просто для того, чтобы доказать это:
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 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
Я запускаю это несколько раз, включая изменение порядка тестов, и результаты согласуются.