2012-07-26 3 views
2

У меня есть datatable с 20 столбцами. Но я не нужен все столбцы для текущей обработки, за исключением 5. Так что я сделал ниже, чтобы удалить столбцыУдалить столбцы из datatable

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

Есть ли рациональное причине вы не хотите делать это с итерации? Это выглядит довольно легко для меня. =) –

+0

Есть ли причина, по которой вы не можете просто изменить свой запрос, чтобы не включать эти столбцы в первую очередь? Или, может быть, мне следовало спросить, как заполняется DataTable? –

ответ

1

Проблема, кажется, в вашем коде, вы получите весь comlumns из DataTable затем удалить столбцы, но вы еще не раз присваиваете столбцы, что DataTable сначала вы получите колонны

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

+0

@Pradeep см. Мой обновленный ответ –

+0

еще прадип прав. –

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

Tim-Is это может быть достигнуто без заявления foreach? – Pradeep

+0

Loop все еще там ... Я не уверен, что он этого хочет –

+1

@Pradeep: вы можете сделать обратное, если знаете, что есть только несколько столбцов. Сначала очистите столбцы и добавьте только эти (см. Мой отредактированный ответ). В общем: конечно ** невозможно удалить или добавить столбцы без циклов (неявных или явных), поскольку это может быть несколько столбцов. Поэтому я предположил, что этот вопрос требует эффективности (читаемость, краткость, производительность). –

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); 
    } 
} 
Смежные вопросы