数据表删除列并重新排序列

本文关键字:排序 新排序 删除列 数据表 | 更新日期: 2023-09-27 18:31:17

我想从数据表中删除不需要的列并按预定义顺序排列列的顺序

例如,我的表列如下所示,

 Col2|Col1|Col3|Test|Test1|Col5|Col4|Some col name|Col6

我想删除测试、Test1 和一些 col 名称,并按数据表重新排序为以下格式

Col1|Col2|Col3|Col4|Col5|Col6
// I need the below columns
List<string> tableColumns = new List<string>();
tableColumns.Add("Col1");
tableColumns.Add("Col2");
tableColumns.Add("Col3");
tableColumns.Add("Col4");
tableColumns.Add("Col5");
tableColumns.Add("Col6");
List<DataColumn> tblColumns = MyDataTable.Columns.Cast<DataColumn>().ToList();
//Remove unwanted columns
foreach (DataColumn col in tblColumns)
{
  if (!tableColumns.Contains(col.ColumnName.Trim()))
  {
   MyDataTable.Columns.Remove(col);
  }
}

现在如何按以下顺序对列重新排序?

Col1|Col2|Col3|Col4|Col5|Col6

我像下面的代码一样尝试过,但如果 tableColumns 中的所有项目都不存在于数据表中,它会失败。此外,有时数据表列名有一些空格(例如" Col1")

foreach (var col in tableColumns)
{
     MyDataTable.Columns[col].SetOrdinal(tableColumns.IndexOf(col));
}

删除不需要的列并重新排列列的最佳方法是什么?

数据表删除列并重新排序列

删除不需要的列后,您可以按以下方法对它们进行排序:

int index = 0;
foreach (var col in
    MyDataTable.Columns
    .Cast<DataColumn>()
    .OrderBy(x => tableColumns.IndexOf(x.ColumnName))
    .ToList())
{
    col.SetOrdinal(index);
    index ++;
}

这将从DataTable中选择列,并按tableColumns列表中相应的索引对它们进行排序。

然后,它对每个SetOrdinal调用,每次递增索引。

我认为您的列可能有随机顺序,例如 Col2、Col1、Col3。并且您要重新排列并删除不需要的列,例如Col1,Col2,Col3。

string[] srr = new string[]{"Col2","Col1","Col3","Test","Test1","Col6","Col4","Some col name","Col5"};
DataTable MyDataTable = new DataTable();
foreach(string col in srr)
{
    MyDataTable.Columns.Add(col);               
}
List<string> arrayNames = (from DataColumn x in MyDataTable.Columns
                      select x.ColumnName).ToList();
foreach(var col in arrayNames)
{
    if(!col.Contains("Col"))
    {
        MyDataTable.Columns.Remove(col);            
    }
    else
    {
        int result = Convert.ToInt32(Regex.Match(col.ToString(), @"'d+$").Value);
        MyDataTable.Columns[col].SetOrdinal(result-1);          
    }
}

这将删除像Test,Test1,一些col名称这样的列,即没有"Col"一词的列(根据您的程序更改逻辑)。然后通过使用正则表达式,它将从列名中提取数字。即"Col1"中的 1,然后根据它重新排列列。