使用不同的列将数据表读入C#中的数组

时间:2017-05-04 16:37:41

标签: c# arrays datatable

我想读取一个数据表,该数据表由每行不同的列组成一个数组。

我的示例数据如下所示

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;

    }

我尝试了上面的代码,但是只要有一个较短的列,结果数组总是有最高的列数和零。我想读它,直到每行的最后一个值然后跳转到下一行。这个问题的任何解决方案?

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,这会做你想要的(而不是预先分配子数组只需使用Lists,然后将它们转换为数组):

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;

}

答案 1 :(得分:-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;
}