如何在C#中将DataTable转换为锯齿状数组?

时间:2014-08-22 15:44:10

标签: c# numpy datatable jagged-arrays

我是C#的新手,我无法在任何地方找到这样的例子(虽然我看过类似的例子,但是演员是ToString,而在我的情况下我想要整数数组)。我有一个DataTable对象,

DataTable results = dbCon.ExecuteQuery("my query");

int m = results.Rows.Count; 
int n = results.Columns.Count;

我想要一个由n个一维数组组成的锯齿状数组(每个数组都是DataTable的一列(results,在这种情况下)。

int[][] jagged = new int[n][];

for (int i = 0; i < n; i++)
            {
                jagged[i] = new int[m];
                //var coli = results.Columns.Cast<Array>().Select(column => Convert.ToInt32(column)).ToArray();
            //jagged[i] = coli;
        }

我尝试了一些事情(例如我评论过的内容),但我现在已经陷入了困境。

如果有人知道怎么做,请发帖!谢谢!

另外,更具体地说,我真的很想使用像NumPy为Python提供的功能... dataSet = np.array(dataList).astype('float')。因为我的DataTable很大,所以双循环不符合我的最佳利益。

3 个答案:

答案 0 :(得分:2)

我认为你还需要创建类型对象的数组。 DataTable DataRow包含object类型的内容,因此您需要将它们存储在锯齿状数组中。

我认为这会奏效:

DataTable table = dbCon.ExecuteQuery("my query");
int rowCount = table.Rows.Count;
int colCount = table.Columns.Count;

object[][] objs = new object[colCount][];

for (int currentColumn = 0; currentColumn < colCount; currentColumn++)
{
    objs[currentColumn] = new object[rowCount];
    for (int currentRow = 0; currentRow < rowCount; currentRow++)
    {
        objs[currentColumn][currentRow] = table.Rows[currentRow][currentColumn];
    }
}

答案 1 :(得分:0)

我想,你已经拥有了这个。尝试:

results.Rows[rowIndex][columnIndex]

要将它变成锯齿状数组,你可以选择简单的 for 循环:

for (int i = 0; i < results.Rows.Count; i++)
{
    for (int j = 0; j < results.Columns.Count; j++)
    {
        jagged[i][j] = results.Rows[i][j];
    }
}

答案 2 :(得分:0)

您可以使用LINQ对DataTable获得您想要的内容。对于DataTable中的每一列,您需要迭代行并选择该列。您需要在列上调用Cast()Select(),并在行AsEnumerable()上调用Select()

int[][] jagged = results.Columns.Cast<DataColumn>()
    .Select(
        col => results.AsEnumerable()
            .Select(row => row.Field<int>(col))
            .ToArray()
    ).ToArray();