0

我有一个带有四列的 DataGridView,需要从其内容中创建一个多行字符串,用逗号分隔。
此代码有效,但可能 - 有一种更优雅的方式:

string multiLine = "";
string singleLine;    
foreach (DataGridViewRow r in dgvSm.Rows)
{
    if (!r.IsNewRow)
    {
        singleLine = r.Cells[0].Value.ToString() + ","
        + r.Cells[1].Value.ToString() + ","
        + r.Cells[2].Value.ToString() + ","
        + r.Cells[3].Value.ToString() + Environment.NewLine;
        multiLine = multiLine + singleLine;
    }
}
4

2 回答 2

3

我不知道优雅,但是:

  1. 使用 StringBuilder进行字符串操作,字符串类型是不可变的!
  2. 如果您需要在两者之间做一些事情,请将第一个或最后一个循环运行分开(例如逗号分隔)所以,基本上是这样的:
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 次字符串连接。
于 2012-06-24T09:31:40.190 回答
0

尝试这个 :

    string multiLine = "";
string singleLine;    
foreach (DataGridViewRow r in dgvSm.Rows)
{
if (!r.IsNewRow)
{
singleLine = r.Cells[0].Value.ToString() + ","
+ r.Cells[1].Value.ToString() + ","
+ r.Cells[2].Value.ToString() + ","
+ r.Cells[3].Value.ToString() + "\r\n";
multiLine = multiLine + singleLine;
}
}
于 2012-06-24T09:39:19.823 回答