2017-05-04 9 views
0

行ごとに可変な列からなるデータテーブルを配列に読み込みたいとします。C#でさまざまな列のデータテーブルを配列に読み込む

私のサンプルデータは、私は、以下のように配列にそれを置くことに成功し、この

1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.098 0.000 
1 0.000 0.051 0.851 0.000 0.000 0.000 0.000   
1 0.000 0.000 0.000 0.000 0.000 0.000 0.266 0.203 0.000 
1 0.011 0.210 0.311 0.000 0.000 0.000 0.000 0.000 0.000 
1 0.000 0.000 0.000 0.000 0.000 0.009 0.007 0.497  
1 0.004 0.023 0.063 0.140 0.000 0.000 0.000 0.000 0.000 
1 0.027 0.010 0.130 0.192 0.156 0.082 0.068 

次のようになります。

public static double[][] dataTableToMatrix(DataTable dt) 
    { 
     double[][] data = new double[dt.Rows.Count][]; 

     for (int x = 0; x < dt.Rows.Count;x++) 
     { 
      data[x] = new double[dt.Columns.Count]; 

      for (int y = 0; y < dt.Columns.Count; y++) 
      { 
       if ((dt.Rows[x][y]) != DBNull.Value) 
       { 
        data[x][y] = Convert.ToDouble(dt.Rows[x][y]); 
       } 
       else 
       { 
        break; 
       } 
      } 
     } 
     return data; 

    } 

私は上記のコードを試みたが、結果の配列は、常に最高の列を持っています短い列があるときはいつでもゼロと共にカウントする。私は各行の最後の値が次の行にジャンプするまでそれを読んでいます。この問題の解決策はありますか?

+1

を作成することも可能です行の長さが異なる表行の長さと値が誤っていると確信していませんか? – Gusman

+0

DataTablesは可変長の行をサポートしていません。列はスキーマレベルで定義され、データベーステーブルと同様です。これらのブランクはヌル値である可能性があります。これは実際にループで処理されています。 –

答えて

0

私は右理解していれば、あなたの問題は、これはあなたが(代わりにサブアレイがちょうどリストを使用して、配列に変換事前割り当ての)やりたいことになります。

public static double[][] dataTableToMatrix(DataTable dt) 
{ 
    double[][] data = new double[dt.Rows.Count][]; 

    for (int x = 0; x < dt.Rows.Count;x++) 
    { 
     List<double> items = new List<double>(); 

     for (int y = 0; y < dt.Columns.Count; y++) 
     { 
      if (dt.Rows[x][y] != DBNull.Value) 
       items.Add(Convert.ToDouble(dt.Rows[x][y])); 
      else 
       break; 
     } 

     data[x] = items.ToArray(); 

    } 

    return data; 

} 
+0

すごい!これは完璧にうまくいった!リストとの関係について簡単に説明できますか? – MarKS

+1

シンプルな配列では、テーブルの行サイズで作成されますが、テーブルは各行で同じ列数を持つため、すべての配列は常にテーブルの列数のサイズになります。 Listは可変サイズのコレクションです。コードは、列にnull値が見つかるまで要素を追加し、その後、要素を含むListを配列に変換します。 – Gusman

+0

私はあなたの質問でコメントを指していたので、あなたは、列が行に存在しないようにnull値を持つことを誤解している、それは完全に間違っている、列は常に各行に存在しますが、それは存在しないものとはまったく異なります。 – Gusman

-1
public static double[][] dataTableToMatrix(DataTable dt) 
{ 
    double[][] data = new double[dt.Rows.Count][]; 

    for (int x = 0; x < dt.Rows.Count;x++) 
    { 
     var countOfNonNullValuesInRow = dt.Rows[x].ItemArray.Count(a => a != DBNull.Value); 
     data[x] = new double[countOfNonNullValuesInRow]; 

     for (int y = 0; y < countOfNonNullValuesInRow; y++) 
     { 
      data[x][y] = Convert.ToDouble(dt.Rows[x][y]); 
     } 
    } 
    return data; 
} 
関連する問題