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
テストの順序を逆にするなど、これを数回実行しましたが、結果は一貫しています。