c # лямбда-линк порядок по индексу нескольких столбцов - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть запрос, который я хочу просто заказать, если ticketStatus = Attended сначала, затем Issue, затем Unpaid, затем Cancelled.Спасибо

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();

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Вы можете использовать пользовательский компаратор (но я думаю, что использование enum намного лучше). Также вы не можете использовать этот компаратор, если ваш 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();
0 голосов
/ 19 ноября 2018

Я только что узнал, что могу использовать с условием

       .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")
0 голосов
/ 15 ноября 2018

Как следует из ответа @mjwills, создайте перечисление. Но!

Вы не можете выполнить сортировку данных на месте, См. Этот ответ .

Итак, выполните следующие два шага, чтобы отсортировать данные.

  1. Создать перечисление

    enum 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();
        }
    }
    

Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...