我不知道优雅,但是:
- 使用 StringBuilder进行字符串操作,字符串类型是不可变的!
- 如果您需要在两者之间做一些事情,请将第一个或最后一个循环运行分开(例如逗号分隔)所以,基本上是这样的:
StringBuilder multiLine = new StringBuilder();
foreach (DataGridViewRow r in dgvSm.Rows)
{
if (!r.IsNewRow)
{
if (r.Cells.Count > 0)
{
multiLine.Append(r.Cells[0].Value.ToString()); //first separated
for (int i = 1; i < r.Cells.Count; ++i)
{
singleLine.Append(','); //between values
singleLine.Append(r.Cells[i].Value.ToString());
}
multiLine.AppendLine();
}
}
}
为了说明 StringBuilder 连接(只是动态字符数组)和字符串(每次使用运算符 + 连接时新对象和复制所有内容)之间的速度差异,请查看小程序:
public static void Main()
{
var sw = new Stopwatch();
sw.Start();
StringBuilder s = new StringBuilder();
//string s = "";
int i;
for (i = 0; sw.ElapsedMilliseconds < 1000; ++i)
//s += i.ToString();
s.Append(i.ToString());
sw.Stop();
Console.WriteLine("using version with type " + s.GetType().Name + " I did " +
i + " times of string concatenation.");
}
对于我的电脑,它是:
使用String类型的版本我做了17682 次字符串连接。
使用StringBuilder类型的版本我做了366367 次字符串连接。