3

20列のデータテーブルがあります。しかし、5つを除いて、現在の処理にすべての列は必要ありません。したがって、列を削除するために以下を実行しました。

List<string> clmnames = new List<string>() { "clm6","clm7"..."clm20" };
foreach (string dcName in clmnames)
{
  TestAndRemoveColumn(dcName, ds.Tables["TestTable"]);
}


 private void TestAndRemoveColumn(string dcName,DataTable datatable)
 {
       DataColumnCollection dcCollection = datatable.Columns;
       if (dcCollection.Contains(dcName))
       {
           dcCollection.Remove(dcName);
       }
 }

15回ループする代わりに、簡単に使用して達成する他の方法はありますか?

4

5 に答える 5

3

一部のシナリオでは、DataTable を複製し、コピーする列を指定する方が望ましい場合があります。

DataView view = new DataView(table);
DataTable table2 = view.ToTable(false, "clm6", "clm7", ...);
于 2015-02-07T17:02:13.590 に答える
1

または、このように必要な列のみ(この場合は5つのみ)を選択することもできます。

        DataTable dt = new DataTable();
        dt.Columns.Add("ID");
        dt.Columns.Add("Value");

        dt.Rows.Add("1", "One");
        dt.Rows.Add("2", "Two");

        string[] arr= new string[1];
        arr[0] = "Value";//add the required columns to the array
        
        //return only the required columns.
        DataTable dt2 = dt.DefaultView.ToTable(false, arr);
于 2012-07-26T10:45:56.570 に答える
1

コードに問題があるようです。データテーブルからすべてのcomlumnsを取得してから列を削除しますが、最初に列を取得したときに、そのデータテーブルに列を再度割り当てる必要はありません。

   DataColumnCollection dcCollection = datatable.Columns; // get cols
   if (dcCollection.Contains(dcName))
   {
       dcCollection.Remove(dcName); /// remove columns
     // but you have not updated you datatable columns.
        here should be something like this
       datatable.Columns = dcCollection; /// i don't know this will work or not check it
   }

これを試して

 DataTable dt;
 dt.Columns.Remove("columnName");
 dt.Columns.RemoveAt(columnIndex);

あなたはそれらをとして使うことができます

private void TestAndRemoveColumn(string dcName,DataTable datatable)
{
    DataTable dt = datatable; 
    dt.Columns.Remove("dcName");      
}
于 2012-07-26T10:09:46.997 に答える
0

削除する列を使用可能な列と結合できます。

var keepColNames = new List<String>(){ "clm5" };
var allColumns   = tbl.Columns.Cast<DataColumn>();
var allColNames  = allColumns.Select(c => c.ColumnName);
var removeColNames = allColNames.Except(keepColNames);
var colsToRemove = from r in removeColNames
                   join c in allColumns on r equals c.ColumnName
                   select c;
while (colsToRemove.Any())
    tbl.Columns.Remove(colsToRemove.First());

残りの列が少ないことがわかっている場合は、列を追加できます。

var colsToAdd = (from keepCol in keepColNames
                 join col in tbl.Columns.Cast<DataColumn>()
                 on keepCol equals col.ColumnName
                 select col).ToList();
tbl.Columns.Clear();
foreach (var colToAdd in colsToAdd)
    tbl.Columns.Add(colToAdd);
于 2012-07-26T10:10:44.220 に答える