使用c#按列名重新排序数据表列

时间:2014-06-13 06:36:14

标签: c# datatable

我有1个数据表,我希望根据列名重新编写所有数据列位置。

假设我有这样的数据表

  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 ,但无法使逻辑获得以上输出

3 个答案:

答案 0 :(得分:1)

我认为没有内置功能可以做到这一点。

我会将所有列名放在List中,对其进行排序并将所有列复制到新表中,您可以在其中按正确的顺序创建列。

SetOrdinal是一种痛苦,因为它也是所有其他列的索引。

由于您的帖子中没有代码,因此未提供代码。

答案 1 :(得分:1)

不漂亮,但确实有效:

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

请注意,任何未计入的-past列(没有非过去的双胞胎)都会自动向右分流,保留原始订单。

答案 2 :(得分:0)

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

                    }

                }