c# - 使用多列 C# 以降序对 DataTable 进行排序
问题描述
我想创建一个方法,该方法能够采用 Datatable 并通过指定的多个列按降序排列行。
下面是我调用表格排序方法的示例:
t1 = getSortedTable(t1 , "Hotel Costs, Flight Cost DESC");
Hotel Costs 和 Flight Costs 都是双列类型。排序方法如下:
public static DataTable getSortedTable(DataTable dt, string sort)
{
DataTable newTable = new DataTable();
newTable = dt.Clone();
newTable.Rows.Clear();
DataRow[] newRows = dt.Select("", sort);
foreach (DataRow nr in newRows)
{
newTable.Rows.Add(nr.ItemArray);
}
return newTable;
}
该方法只返回一个表,其中的行按 Flight Cost 降序排列。
解决方案
您可以使用DefaultView
排序参数指定 并返回该视图ToTable()
:
public static DataTable GetSortedTable(DataTable dt, string sort)
{
dt.DefaultView.Sort = sort;
return dt.DefaultView.ToTable();
}
编辑:列名中有空格可能会干扰排序,因此您可以像这样重命名列名:
foreach(var column in dt.Columns)
{
column.ColumnName = column.ColumnName.Replace(" ", "_");
}
或者使用 linq
if (dt.Rows.Count > 0)
{
dt = dt.AsEnumerable().OrderByDescending(x=>x.Field<decimal>("Hotel Costs")).ThenByDescending(x=>x.Field<decimal>("Flight Costs"))
.Select(x=>x)
.CopyToDataTable();
}
推荐阅读
- typescript - Typescript 元组成员的类型解析 - 为什么会编译?
- php - 在 Wordpress 中创建自定义帖子类型
- javascript - 如何使用 Visual Studio 2019 和 javascript 从 api 获取数据?
- git - 提交详细信息中显示的被阻止用户
- smtp - 如何更改或覆盖 Google Composer Airflow 的 smtp_password
- ruby - 我的 ruby while 循环没有给我任何输出作为数字数组
- docker - 在 docker build 中等待连接时请求被取消
- php - 如何在 Laravel 中为 eloquent 执行 1 到多个更新功能?
- excel - 如果一列或两列都没有填满,有没有办法计算?
- openedge - 如何更改 OpenEdge Progress 中 DATE 变量的默认格式?