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

时间:2018-05-08 09:12:16

标签: c# linq lambda

我遇到了这个答案Entity framework OrderBy “CASE WHEN” , 我总是使用OrderBy按特定属性进行排序,但不知道这样的内容如何有用甚至存在:

foos.OrderBy(f => f.Val3? 1 : 0);

我创建了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}");
    }
}

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

orderedFoos中,第一项和第二项被交换(“c”项成为第一项):

enter image description here

以及何时:

var orderedFoos = foos.OrderBy(f => f.Val2 == "c" ? 3 : 1).ToList();

“c”项目成为最后一项。

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

2 个答案:

答案 0 :(得分:5)

如果你这样做,它不是由该属性排序,而是由条件运算符返回的值排序。因此,每条记录都会得到一个&#34;排序值&#34;并按列表对列表进行排序:

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}

如何对余数进行排序取决于底层存储(在谈论Linq-to-Entities时)。要在List<T>上使用,请使用排序为guaranteed to be "stable"Enumerable.OrderBy()

  

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

答案 1 :(得分:0)

图像显示了正在发生的事情。 为了更好地理解,请创建orderby lambda语句的列表:

C是真的,其他所有都是假的,因为没有别的方式来命令它们是排序的唯一逻辑方式。它们按照它们进入的顺序排列(所以没有排序)。

当您打印结果时,它会返回顶部的C,然后按照您输入的顺序返回所有其他项目。