0

我有一个包含动态行数和动态列数的 DataTable,

col1        col2        col3        col4............colN
________________________________________________________________________
row1col1    row1col2    row1col3    row1col4........row1colN
.           .               .       .               .
.           .               .       .               .
.           .               .       .               .
.           .               .       .               .
.           .               .       .               .
.           .               .       .               .
rowNcol1    rowNcol2    rowNcol3    rowNcol4.......rowNcolN

如何从 DataTable 的前 n 列中选择数据?

4

4 回答 4

1

获取列:

   var tbl = new System.Data.DataTable();
var cols = tbl.Columns.Cast<System.Data.DataColumn>().Take(20);

// 如果您希望获得前 20 列...

如果要获取数据,则必须遍历列以获取数据。

var data = cols.SelectMany(x => tbl.Rows.Cast().Take(100).Select(y => y[x]));

当然,这会将所有数据转储到一个 ienumerable 中,如果你想使用强类型对象或一维数组的列表,相信它相当简单,例如:

var data2 = cols.Select(x => tbl.Rows.Cast().Take(100).Select(y => y[x]).ToArray());

如果您希望保留当前表并保留列/行数,您可以删除其余列/行:

        var tbl = new System.Data.DataTable();
        int totalColumnsToReserve = 20;
        for (int i = tbl.Columns.Count - 1; i >= totalColumnsToReserve; i--)
        {
            tbl.Columns.RemoveAt(i);
        }

        int totalRowsToReserve = 100;
        for (int i = tbl.Rows.Count - 1; i >= totalRowsToReserve; i--)
        {
            tbl.Rows.RemoveAt(i);
        }
于 2013-07-31T06:23:24.980 回答
1

您可以使用以下函数从 DataTable 中获取前 n 列;其中objSource是源 DataTable 并且outputCols是需要的前 n 列。如果outputCols是 <= 0 或 >= 源 DataTable 中的总列,则它只返回所有列。

private DataTable GetNColumnsFromDataTable(DataTable objSource, int outputCols)
{
    DataTable objOutput = objSource.Copy();

    if (outputCols > 0 && outputCols < objSource.Columns.Count)
    {
        while (outputCols < objOutput.Columns.Count)
        {
            objOutput.Columns.RemoveAt(objOutput.Columns.Count - 1);
        }
    }

    return objOutput;
}
于 2013-07-31T08:58:48.963 回答
0

遍历行并为每一行遍历 n 列。但是,我不确定您要如何处理结果。

n 是第一个列数的示例:

    var data = dataTable.AsEnumerable();
    const int n = 5;
    foreach (var row in data)
    {
      for (int i = 0; i < n; i++)
      {
        var value = row[i];
      }
    }
于 2013-07-31T06:22:40.077 回答
0

首先使用 select() 获取 DataRows 的数组,然后像数组一样访问每一行

DataTable DT = new DT();
DataRow[] rows = DT.Select();

foreach(DataRow row in rows)
{
    for(int i =0; i<n; i++
    {
          rows[i]; //do whatever you want with this
    }
}
于 2013-07-31T06:34:20.253 回答