ASP.NET Заказать bool с не установленным - PullRequest
0 голосов
/ 08 февраля 2019

Как мне сначала заказать bool по null, затем по true, затем по ложному

return View("Index", db.HolidayRequestForms.ToList().OrderByDescending(e => e.Approved).ThenBy(e => e.RequestID))

Я использую пользовательский шаблон отображения для bool, не знаю, имеет ли это значение

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы можете использовать это:

myList.OrderBy(v => !v)
0 голосов
/ 08 февраля 2019

Вы можете использовать пользовательский компаратор

public class ApprovedComparer : IComparer<bool?>
{
    public int Compare(bool? x, bool? y)
    {
        var a = 0;
        var b = 0;

        if (x.HasValue)
            a = x.Value ? 1 : 2;
        if (y.HasValue)
            b = y.Value ? 1 : 2;

        return a - b;
    }
}

Использование:

return View("Index", db.HolidayRequestForms.ToList()
    .OrderBy(e => e.Approved, new ApprovedComparer())
    .ThenBy(e => e.RequestID))

Может быть протестировано в LinqPad (или обычном консольном приложении)

public class Thing
{
    public string Name { get; set; }
    public bool? Approved { get; set; }
}

public class ApprovedComparer : IComparer<bool?>
{
    public int Compare(bool? x, bool? y)
    {
        var a = 0;
        var b = 0;

        if (x.HasValue)
            a = x.Value ? 1 : 2;
        if (y.HasValue)
            b = y.Value ? 1 : 2;

        return a - b;
    }
}

void Main()
{
    var thing1 = new Thing { Approved = null, Name = "Thing 1" };
    var thing2 = new Thing { Approved = true, Name = "Thing 2", };
    var thing3 = new Thing { Approved = false, Name = "Thing 3" };

    //note the 'incorrect' order
    var listOfThings = new[] { thing3, thing2, thing1 };

    listOfThings
        .OrderBy(x => x.Approved, new ApprovedComparer())
        .Select(x => x.Name) //just for outputting the names
        .Dump(); //LinqPad specifc
}

Выходные данные

enter image description here

Начиная с .net 4.5, вы можете использовать Comparer<T>.Create() для создания статического компаратора, который может быть 'inline '- т. е. отдельный класс не требуется.

Лично я считаю, что отдельный класс немного чище для чтения.Только мое мнение, однако.

var comparer = Comparer<bool?>.Create((x, y) =>
   {
       var a = 0;
       var b = 0;

       if (x.HasValue)
           a = x.Value ? 1 : 2;
       if (y.HasValue)
           b = y.Value ? 1 : 2;

       return a - b;
   });

listOfThings
    .OrderBy(x => x.Approved, comparer)
    .Select(x => x.Name) //just for outputting the names
    .Dump(); //LinqPad specifc
...