2012-07-26 91 views
2

我有一個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次循環中是否有任何其他方式來實現使用容易嗎?

+1

是否有您不想與迭代做任何合理的理由?這對我來說很容易。 =) – 2012-07-26 10:18:34

+0

是否有任何理由不能只修改您的查詢,以便不在第一個地方包含這些列?或者,也許我應該問如何首先填充DataTable? – 2012-07-26 10:19:16

回答

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");  
} 
+1

要刪除我所有的15列,我需要寫上述代碼15次。 – Pradeep 2012-07-26 10:11:58

+0

@Pradeep看到我的更新回答 – 2012-07-26 10:13:40

+0

仍pradeep是.. – 2012-07-26 10:14:33

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()); 

如果你知道你只有少數剩餘的列,您可以添加列(S):

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

Tim-Is這可以在沒有foreach語句的情況下實現嗎? – Pradeep 2012-07-26 10:15:23

+0

循環仍然存在......我不確定這是他想要的 – 2012-07-26 10:15:30

+1

@Pradeep:如果您知道只有幾列,則可以做相反的事情。首先清除列,然後只添加這些列表(請參閱我編輯的答案)。一般來說:當然這是**不可能的**,因爲它可能是多列,所以刪除或添加沒有循環的列(隱式或顯式)。所以我認爲這個問題要求效率(可讀性,簡潔性,性能)。 – 2012-07-26 10:25:11

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

希望這會有所幫助。

3

在某些情況下可能更適合克隆DataTable並指定要複製的列。

DataView view = new DataView(table); 
DataTable table2 = view.ToTable(false, "clm6", "clm7", ...); 
2

試試這個

List<string> listtoRemove = new List<string> { "CLM6", "CLM7", "CLM20" }; 
for (int i = dt.Columns.Count - 1; i >= 0; i--) 
{ 
    DataColumn dc = dt.Columns[i]; 
    if (listtoRemove.Contains(dc.ColumnName.ToUpper())) 
    { 
     dt.Columns.Remove(dc); 
    } 
}