C# ASP.NET订单bool未设置

C# ASP.NET订单bool未设置,c#,linq,boolean,C#,Linq,Boolean,我如何先按null、true、false对布尔进行排序 return View("Index", db.HolidayRequestForms.ToList().OrderByDescending(e => e.Approved).ThenBy(e => e.RequestID)) 我正在为布尔使用自定义显示模板,我不知道这是否重要您可以使用自定义比较器 public class ApprovedComparer : IComparer<bool?> { pub

我如何先按null、true、false对布尔进行排序

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

我正在为布尔使用自定义显示模板,我不知道这是否重要

您可以使用自定义比较器

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;
    }
}
可在LinqPad(或普通控制台应用程序)中测试

公共类的东西
{
公共字符串名称{get;set;}
公共bool?已批准{get;set;}
}
公共类批准的比较程序:IComparer
{
公共整数比较(布尔?x,布尔?y)
{
var a=0;
var b=0;
if(x.HasValue)
a=x.值?1:2;
if(y.HasValue)
b=y.值?1:2;
返回a-b;
}
}
void Main()
{
var thing1=新事物{Approved=null,Name=“thing1”};
var thing2=新事物{Approved=true,Name=“thing2”,};
var thing3=新事物{Approved=false,Name=“thing3”};
//注意“不正确”的顺序
var listOfThings=new[]{thing3,thing2,thing1};
物品清单
.OrderBy(x=>x.已批准,新批准的Comparer())
.Select(x=>x.Name)//仅用于输出名称
.Dump();//LinqPad specific
}
输出

从.net 4.5开始,您可以使用
Comparer.Create()
创建静态比较器,它可以是“内联”的,即不需要单独的类

就我个人而言,我觉得单独的类更容易阅读。不过,这只是我的看法

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
var comparer=comparer.Create((x,y)=>
{
var a=0;
var b=0;
if(x.HasValue)
a=x.值?1:2;
if(y.HasValue)
b=y.值?1:2;
返回a-b;
});
物品清单
.OrderBy(x=>x.已批准,比较者)
.Select(x=>x.Name)//仅用于输出名称
.Dump()//LinqPad特定

您可以使用自定义比较器

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;
    }
}
可在LinqPad(或普通控制台应用程序)中测试

公共类的东西
{
公共字符串名称{get;set;}
公共bool?已批准{get;set;}
}
公共类批准的比较程序:IComparer
{
公共整数比较(布尔?x,布尔?y)
{
var a=0;
var b=0;
if(x.HasValue)
a=x.值?1:2;
if(y.HasValue)
b=y.值?1:2;
返回a-b;
}
}
void Main()
{
var thing1=新事物{Approved=null,Name=“thing1”};
var thing2=新事物{Approved=true,Name=“thing2”,};
var thing3=新事物{Approved=false,Name=“thing3”};
//注意“不正确”的顺序
var listOfThings=new[]{thing3,thing2,thing1};
物品清单
.OrderBy(x=>x.已批准,新批准的Comparer())
.Select(x=>x.Name)//仅用于输出名称
.Dump();//LinqPad specific
}
输出

从.net 4.5开始,您可以使用
Comparer.Create()
创建静态比较器,它可以是“内联”的,即不需要单独的类

就我个人而言,我觉得单独的类更容易阅读。不过,这只是我的看法

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
var comparer=comparer.Create((x,y)=>
{
var a=0;
var b=0;
if(x.HasValue)
a=x.值?1:2;
if(y.HasValue)
b=y.值?1:2;
返回a-b;
});
物品清单
.OrderBy(x=>x.已批准,比较者)
.Select(x=>x.Name)//仅用于输出名称
.Dump()//LinqPad特定
您可以使用以下功能:

myList.OrderBy(v => !v)
您可以使用以下选项:

myList.OrderBy(v => !v)

未设置
-您的意思是
已批准
可为空吗?@Alex是的,这是用于请求页面,因此可为空将挂起
未设置
-您的意思是
已批准
可为空吗?@Alex是的,这是用于请求页面,因此可为空将挂起