C# 使用c按列名对datatable列重新排序
我有1个datatable,我想根据列名对所有datacolumn位置重新排序 假设我有这样的数据表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
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);
}
}
}