在我的项目中,我正在遍历数据视图结果。
string html =string.empty;
DataView dV = data.DefaultView;
for(int i=0;i< dV.Count;i++)
{
DataRowView rv = dV[i];
html += rv.Row["X"].Tostring();
}
dV中的行数总是3或4。
在这种情况下使用字符串concat + = opearator或StringBuilder会更好吗?
答案 0 :(得分:36)
我会在这里使用StringBuilder
,因为它描述了你正在做的事情。
对于3或4个字符串的简单连接,它可能不会产生任何显着差异,字符串连接可能甚至会稍微快一点 - 但如果你错了并且有很多行,StringBuilder
将开始变得更有效率,并且总是更能描述您正在做的事情。
或者,使用类似的东西:
string html = string.Join("", dv.Cast<DataRowView>()
.Select(rv => rv.Row["X"]));
请注意,目前字符串之间没有任何分隔符。你确定那是你想要的吗? (另请注意,您的代码目前没有多大意义 - 您在循环中没有使用i
。为什么?)
我有一个article about string concatenation,详细了解为什么值得使用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
我已经多次运行,包括颠倒测试的顺序,结果是一致的。
答案 1 :(得分:5)
建议使用StringBuilder ..为什么不对自己进行分析,然后决定什么对你最好..
var stopWatch=new StopWatch();
stopWatch.Start();
string html =string.empty;
DataView dV = data.DefaultView;
for(int i=0;i< dV.Count;i++)
{
html += dV.Row["X"].Tostring();
}
stopWatch.Stop();
Console.Write(stopWatch.EllapsedMilliseconds());
var stopWatch=new StopWatch();
stopWatch.Start();
string html =new StringBuilder();
DataView dV = data.DefaultView;
for(int i=0;i< dV.Count;i++)
{
html.Append(dV.Row["X"].ToString());
}
var finalHtml=html.ToString();
stopWatch.Stop();
Console.Write(stopWatch.EllapsedMilliseconds());
答案 2 :(得分:2)
如果是,则String类优先用于连接操作 固定数量的String对象是连接在一起的。在那种情况下, 单个连接操作甚至可以组合成一个 由编译器单一操作。
如果是串联操作,则StringBuilder对象更可取 连接任意数量的字符串;例如,如果a 循环连接随机数量的用户输入字符串。
所以在你的情况下,我会说String更好。
修改强>
这是一个无休止的讨论,无论如何,我建议你检查你平均有多少操作,并测试每一个的性能以比较结果。
请检查nice link此问题,包括一些性能测试代码。
答案 3 :(得分:1)
StringBuilder肯定。字符串是不可变的记住!
编辑:对于3-4行,串联将是Jon Skeet在他的回答中所说的首选
答案 4 :(得分:1)
StringBuilder。这是可变的。它应该减少对内存分配器的压力: - )
字符串实例是不可变的。你不能改变它 创建。 任何看似改变字符串的操作都会返回一个新实例。
答案 5 :(得分:0)
stringbuilder就是你要找的。一般来说,如果有某个工作的功能尝试使用它而不是写一些做同样工作的程序。