从数据表中删除除 25 之外的所有列

Remove all columns from datatable except for 25

我的 DataTable 中有 500 列,我想删除除 25 列之外的所有列。

有什么方法可以更快地完成此操作以节省时间和代码行数?

这是我已经尝试过的:

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

如果它们有不同的名称,则创建一个字符串数组

var columns = new string[] { "Harry", "Konstantin","John"};
 var columnsToKeep = new string[] { "John", "Konstantin"};

    var columnsToDelete = from item in columns
                where !columnsToKeep.Contains(item)
                select item;

或使用 lambda

   var columnsToDelete = columns
                    .Where (i=> !columnsToKeep.Contains(i))
                    .ToList();

删除

Harry

Test1...test9 相同的代码可以循环。无需在列表中添加要删除的列,只需在第一个 while 循环中删除它们即可。至于性能,不知道如何改进。

您可以尝试使用选择所需列的 DataView,然后复制到 table。你需要试验一下。

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