我需要根据单元格值的情况对数据表进行排序 我试过了:
DataTable dt = new DataTable();
...
dt.DefaultView.Sort = "Case When Col6 = 'open' then 1 When Col6 = 'approved' then 2 When Col6 = 'awaitingApproval' then 3 else 999 end asc";
但是失败了。 我该如何在数据表上选择大小写合并,例如我可以在sql中编写:
order by
Case
When Col6 = 'open' then 1
When Col6 = 'approved' then 2
When Col6 = 'awaitingApproval' then 3
else 999
end asc
答案 0 :(得分:1)
如何使用linq?这实际上不会对数据表进行排序,但会返回新的行排序集合。
var result =
dt.AsEnumerable().OrderBy (x =>
{
switch (x.Field<string>("Col6"))
{
case "open" : return 1;
case "approved" : return 2;
case "awaitingApproval" : return 3;
}
return 999;
});
答案 1 :(得分:0)
使用以下表达式在数据表中创建一个计算列:
IIF(Col6='open', 1, IIF(Col6='approved', 2, IIF(Col6='awaitingApproval', 3, 999)))
然后,您可以轻松地对计算列进行排序
dt.Columns.Add("CalculatedField", typeof(Int32));
dt.Columns["CalculatedField"].Expression = "IIF(Col6='open', 1, IIF(Col6='approved', 2, IIF(Col6='awaitingApproval', 3, 999)))";
dt.DefaultView.Sort = "CalculatedField";
答案 2 :(得分:0)
如果您想要更多LinQ-ed
的方式,那么可以尝试的是
DataTable dt = new DataTable();
List<string> sortString = new List<string>();
sortString.Add("open");
sortString.Add("approved");
sortString.Add("awaitingApproval");
var listsa = dt.AsEnumerable().GroupBy(x => x["Col6"].ToString()).ToList();
sortString.ForEach(str => listsa.ForEach(x =>
{
if (x.Key == str)
dt.Rows.Add(x.ToList());
}));