如何从DataTable中选择前n列

时间:2013-07-31 06:09:49

标签: c# linq data-structures

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

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

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

4 个答案:

答案 0 :(得分:1)

获取列:

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

//如果你想获得前20列......

如果你想获取数据,那么你必须遍历列来获取数据。

  

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

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

  

var data2 = cols.Select(x =&gt;   tbl.Rows.Cast()。Take(100).Select(y =&gt; 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);
        }

答案 1 :(得分:1)

您可以使用以下函数从DataTable获取前n列; 其中objSource是源DataTable,outputCols首先需要n列。 如果outputCols是&lt; = 0或&gt; =源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;
}

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

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