2012-07-26 93 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); 
    } 
}