C# 使用c按列名对datatable列重新排序

C# 使用c按列名对datatable列重新排序,c#,datatable,C#,Datatable,我有1个datatable,我想根据列名对所有datacolumn位置重新排序 假设我有这样的数据表 Click Impression Cost Click-past Impression-past cost-past 1 2 3 11 22 33 然后,如何对给定的列进行排序以获得类似的数据 Click Click-past Impression

我有1个datatable,我想根据列名对所有datacolumn位置重新排序

假设我有这样的数据表

  Click    Impression   Cost   Click-past  Impression-past   cost-past 
     1          2          3       11           22               33
然后,如何对给定的列进行排序以获得类似的数据

  Click    Click-past  Impression   Impression-past   Cost   cost-past
    1           11        2                22           3        33

我使用的是SetOrdinal,但无法生成逻辑以获得高于输出的值。我认为,没有内置函数可以做到这一点

我将把所有列名放在一个列表中,对其进行排序,然后将所有列复制到一个新表中,在这个表中可以按正确的顺序创建列

SetOrdinal是个麻烦,因为它也是所有其他列的索引


没有给出代码,因为您的帖子中没有代码。

不太好看,但它可以工作:

DataTable dt = new DataTable {
    Columns = {
        "Click", "Impression", "Cost", "Click-past",
        "Impression-past", "cost-past"
    }
};
Dictionary<string, DataColumn> colByName = dt.Columns.OfType<DataColumn>()
    .ToDictionary(x => x.ColumnName, StringComparer.InvariantCultureIgnoreCase);
List<DataColumn> sorted = new List<DataColumn>(dt.Columns.Count);
foreach (DataColumn col in dt.Columns)
{
    if (!col.ColumnName.EndsWith("-past",
        StringComparison.InvariantCultureIgnoreCase))
    {
        sorted.Add(col);
        DataColumn past;
        if (colByName.TryGetValue(col.ColumnName + "-past", out past))
            sorted.Add(past);
    }
}
int ordinal = 0;
foreach(var col in sorted)
{
    col.SetOrdinal(ordinal++);
}
foreach(DataColumn col in dt.Columns)
    System.Console.WriteLine(col.ColumnName);

请注意,没有非过去双精度的任何未解释的-过去列将自动向右分流,保留其原始顺序。

您可以添加代码吗?编辑中的前一个-是什么?这在数据表中不存在。这里的排序背后的逻辑是什么?SetOrdinal很好用。。。
 DataTable dt_reorder = ds1.Tables[i];

                //string[] columnNames = (from dc in dt_reorder.Columns.Cast<DataColumn>() select dc.ColumnName).OrderByDescending(c => c.Colum);

                System.Collections.Generic.List<string> lstColNames = (from DataColumn col in dt_reorder.Columns select col.ColumnName).ToList();



                foreach (string value in lstColNames)
                {
                    string aa = value.ToString();
                    if (!aa.Contains("-past"))
                    {
                        if (lstColNames.Contains(aa + "-past"))
                        {
                            dt_reorder.Columns[aa + "-Previous"].SetOrdinal(dt_reorder.Columns.IndexOf(aa) + 1);
                        }

                    }

                }