Search code examples
c#datatable

Remove all columns from datatable except for 25


I have 500 Columns in my DataTable and I want to remove all of them except for 25 columns.

Is there any way to do this faster to save time and lines of code?

This is what I already tried:

private static void DeleteUselessColumns()
{
    //This is example data!
    List<DataColumn> dataColumnsToDelete = new List<DataColumn>();
    DataTable bigData = new DataTable();
    bigData.Columns.Add("Harry");
    bigData.Columns.Add("Konstantin");
    bigData.Columns.Add("George");
    bigData.Columns.Add("Gabriel");
    bigData.Columns.Add("Oscar");
    bigData.Columns.Add("Muhammad");
    bigData.Columns.Add("Emily");
    bigData.Columns.Add("Olivia");
    bigData.Columns.Add("Isla");
    
    List<string> columnsToKeep = new List<string>();
    columnsToKeep.Add("Isla");
    columnsToKeep.Add("Oscar");
    columnsToKeep.Add("Konstantin");
    columnsToKeep.Add("Gabriel");

    //This is the code i want to optimize------
    foreach (DataColumn column in bigData.Columns)
    {
        bool keepColumn = false;
        foreach (string s in columnsToKeep)
        {
            if (column.ColumnName.Equals(s))
            {
                keepColumn = true;
            }
        }
        if (!keepColumn)
        {
            dataColumnsToDelete.Add(column);
        }
    }
    
    foreach(DataColumn dataColumn in dataColumnsToDelete)
    {
        bigData.Columns.Remove(dataColumn);
    }
    //------------------------
}    

Solution

  •    var columnsToKeep = new List<string>() { "Isla", "Oscar", "Konstantin", "Gabriel"};
        var toRemove = new List<DataColumn>();
        
        foreach(DataColumn column in bigData.Columns)
        {
          if (!columnsToKeep.Any(name => column.ColumnName == name ))
          {
             toRemove.Add(column);
          }
        }
        
        toRemove.ForEach(col => bigData.Columns.Remove(col));