首页 > 解决方案 > 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();

标签: c#linqlambda

解决方案


正如@mjwills 回答所建议的,创建一个枚举。但!

您无法对数据表进行就地排序,请参阅此答案

因此,请按照以下两个步骤对数据表进行排序。

  1. 创建一个枚举

    枚举 TicketStatuses { 已参加 = 1,已签发 = 2,未付 = 3,已取消 = 4 }

  2. 我在 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();
        }
    }
    

干杯!


推荐阅读