0

4つの列を持つ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.");
}

私のコンピューターの場合は次のとおりです。

文字列型のバージョンを使用して、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 に答える