我有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 ,但无法使逻辑获得以上输出
答案 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);
}
}
}