2013-07-31 85 views
0

列的前n數我有一個包含行的動態數和列的動態數量的DataTable,如何選擇一個DataTable

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

如何選擇從數據表中列第n個數據?

+0

你想在第一行的總列數? – 2013-07-31 06:11:44

+0

沒有,我想從數據表 –

+1

你用'select' datatable.Columns屬性不會幫助的意思選擇前5列中的數據?你想選擇數據還是要顯示'n'列? –

回答

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,如果要使用強類型對象或一個維數組的名單,認爲這是相當簡單的,例如:

變種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); 
     } 
+0

該查詢將列作爲行並在行中再次包含包含列值的枚舉。是否有可能獲得它的數據表? –

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]; 
     } 
    } 
0

首先使用獲得數據行的數組選擇(),然後訪問每一行像陣列

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 
    } 
} 
1

可以使用以下函數來獲取從數據表中的列的第一n個; 其中objSource是源數據表和outputCols是所需的第一n列。 如果outputCols是< = 0或> =源數據表中的所有列,則它只返回所有列。

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; 
}