C#lambda linq按多列索引排序

时间:2018-11-15 06:09:12

标签: c# linq lambda

我有一个查询,只是想按ticketStatus =出席,然后发出,然后未付款,然后取消的顺序订购。谢谢

#include<stdio.h> 
int main()
{
    int a = a;
    printf ("%d",a);
    return 0;
}

3 个答案:

答案 0 :(得分:0)

按照@mjwills答案的建议,创建一个枚举。但是!

  

您无法对数据表See this answer进行就地排序。

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

  1. 创建一个枚举

      

    枚举TicketStatuss       {       出席= 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();
        }
    }
    

干杯!

答案 1 :(得分:0)

您可以使用自定义比较器(但是我想使用枚举会更好)。 另外,如果您的OrderBy应该转换为SQL查询,则不能使用此比较器。

示例:

public class TicketStatusComparer : IComparer<string>
{
    private int GetIntValue( string value )
    {
        switch ( value )
        {
            case "Attended":
                return 1;
            case "Issue":
                return 2;
            case "Unpaid":
                return 3;
        }

        return 0;
    }

    public int Compare( string x, string y )
    {
        return GetIntValue( x ) - GetIntValue( y );
    }
}

然后像这样使用它:

var list = new[]
{
    new { A = 1, TicketStatus = "Issue" },
    new { A = 2, TicketStatus = "Attended" },
    new { A = 3, TicketStatus = "Unpaid" },
    new { A = 4, TicketStatus = "Attended" },
    new { A = 5, TicketStatus = "Unpaid" },
};

var xxx = list.OrderBy( x => x.TicketStatus, new TicketStatusComparer() ).ToList();

答案 2 :(得分:0)

我刚刚发现我可以使用条件

       .OrderBy(x => x["TicketStatus"].ToString())
        .ThenBy(x => x["TicketStatus"].ToString() == "Attended")
        .ThenBy(x => x["TicketStatus"].ToString() == "Issued")
        .ThenBy(x => x["TicketStatus"].ToString() == "Unpaid")
        .ThenBy(x => x["TicketStatus"].ToString() == "Cancelled")