c# - c# lambda linq 按多列索引排序
问题描述
我有一个查询,只想按以下顺序订购:ticketStatus = 先参加,然后是问题,然后是未付款,然后是已取消。谢谢
var duplicate = dt.AsEnumerable()
.OrderBy((x,index) => index(ticketStatusOrder.IndexOf(x["TicketStatus"].ToString())))
//.OrderBy(x => x["TicketStatus"].ToString() == "Attended")
//.ThenBy(x => x["TicketStatus"].ToString() == "Issued")
//.ThenBy(x => x["TicketStatus"].ToString() == "Unpaid")
//.ThenBy(x => x["TicketStatus"].ToString() == "Cancelled")
.GroupBy(x => new {EventID = x["EventID"].ToString(), ContactID = x["ContactID"].ToString()})
.Select(x => x.FirstOrDefault()).CopyToDataTable();
解决方案
正如@mjwills 回答所建议的,创建一个枚举。但!
您无法对数据表进行就地排序,请参阅此答案。
因此,请按照以下两个步骤对数据表进行排序。
创建一个枚举
枚举 TicketStatuses { 已参加 = 1,已签发 = 2,未付 = 3,已取消 = 4 }
我在 VS2017 和 .Net Core 2 中尝试了以下代码,并根据您的要求正确排序。
class Program { static void Main(string[] args) { DataTable dt = new DataTable(); DataColumn dc = new DataColumn("id", typeof(String)); dt.Columns.Add(dc); dc = new DataColumn("TicketStatus", typeof(TicketStatuses)); dt.Columns.Add(dc); DataRow dr; //Adding test data of 6 rows for (int i = 0; i <= 6; i++) { dr = dt.NewRow(); dr[0] = i + 2; //Just a random column value - Could be anything here. dt.Rows.Add(dr); } // Setting column values for Column "TicketStatus" of our choice. dt.Rows[0][1] = TicketStatuses.Unpaid; dt.Rows[1][1] = TicketStatuses.Cancelled; dt.Rows[2][1] = TicketStatuses.Cancelled; dt.Rows[3][1] = TicketStatuses.Issued; dt.Rows[4][1] = TicketStatuses.Attended; dt.Rows[5][1] = TicketStatuses.Attended; dt.Rows[6][1] = TicketStatuses.Issued; //sorting datarows DataRow[] dataRows = dt.Select().OrderBy(u => u["TicketStatus"]).ToArray(); DataTable sortedDatatable = dataRows.CopyToDataTable(); } }
干杯!
推荐阅读
- oracle - 通过 ODBC 的 Oracle 数据库将非英语字符转换为问号
- python - 发生异常:OperationalError 无法将主机名“db”转换为地址:未知主机
- reactjs - ReactJS 复杂(if / else if)没有按预期工作
- javascript - 时间选择器问题
- bash - bash:将各种名称添加到列表中的关联接口名称
- javascript - 单个周期的 Javascript 无法识别的表达式
- ios - 使用泛型时,从子级到父级的强制转换在调试中保留覆盖,但在生产中保留?
- python - 使用 Python 多处理并行化时 CPU 空闲
- ruby-on-rails - 无法启动 Rails 服务器:BigDecimal:Class (NoMethodError) 的未定义方法“yaml_as”
- ssh - 带参数的 SSH URI