具有硬编码返回值的三元运算符如何在LINQ的OrderBy中工作?

msh*_*hwf 0 c# linq lambda

我遇到了这个答案实体框架OrderBy"CASE WHEN" ,我总是用OrderBy特定属性来订购,但不知道这样的东西怎么可能有用甚至存在:

foos.OrderBy(f => f.Val3? 1 : 0);
Run Code Online (Sandbox Code Playgroud)

我创建了一个Foo类来观察它是如何工作的:

class Foo
{
    public int Id { get; set; }
    public int Val1 { get; set; }
    public string Val2 { get; set; }
    public bool Val3 { get; set; }
    public override string ToString()
    {
        return string.Format($"{Id}> {Val1}, {Val2}, { Val3}");
    }
}
Run Code Online (Sandbox Code Playgroud)

Main:

List<Foo> foos = new List<Foo>
        {
            new Foo{Id=1,Val1=5, Val2= "a", Val3= true},
            new Foo{Id=2,Val1=4, Val2= "c", Val3= false},
            new Foo{Id=3,Val1=1, Val2= "f", Val3= false},
            new Foo{Id=4,Val1=2, Val2= "d", Val3= true},
            new Foo{Id=5,Val1=9, Val2= "i", Val3= true},
            new Foo{Id=6,Val1=7, Val2= "h", Val3= true},
            new Foo{Id=7,Val1=6, Val2= "g", Val3= true},
            new Foo{Id=8,Val1=8, Val2= "b", Val3= true},
            new Foo{Id=9,Val1=3, Val2= "e", Val3= false}
        };

var orderedFoos = foos.OrderBy(f => f.Val2 == "c" ? 1 : 2).ToList();
Run Code Online (Sandbox Code Playgroud)

orderedFoos第一个和第二个项目交换("c"项目成为第一个):

在此输入图像描述

什么时候:

var orderedFoos = foos.OrderBy(f => f.Val2 == "c" ? 3 : 1).ToList();
Run Code Online (Sandbox Code Playgroud)

"c"项目成为最后一项.

我使用了具有不同属性的多个值,但是没有注意到模式

Cod*_*ter 5

如果你这样做,它不是由该属性排序,而是由条件运算符返回的值.因此,每条记录都获得一个"排序值",列表按以下顺序排序:

new Foo { Id=2, Val2= "c", VirtualSortValue = 1}, // because "c"
new Foo { Id=1, Val2= "a", VirtualSortValue = 2}, // because not "c"
new Foo { Id=3, Val2= "f", VirtualSortValue = 2},
new Foo { Id=4, Val2= "d", VirtualSortValue = 2},
new Foo { Id=5, Val2= "i", VirtualSortValue = 2},
new Foo { Id=6, Val2= "h", VirtualSortValue = 2},
new Foo { Id=7, Val2= "g", VirtualSortValue = 2},
new Foo { Id=8, Val2= "b", VirtualSortValue = 2},
new Foo { Id=9, Val2= "e", VirtualSortValue = 2}
Run Code Online (Sandbox Code Playgroud)

剩余部分的排序方式取决于底层存储(当谈到Linq-to-Entities时).对于List<T>您使用的用途Enumerable.OrderBy(),其种类保证是"稳定的":

该方法执行稳定的排序; 也就是说,如果两个元素的键相等,则保留元素的顺序.相反,不稳定的排序不会保留具有相同键的元素的顺序.