繁体   English   中英

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

[英]How does ternary operator with hard coded return values work in LINQ's OrderBy?

我遇到了这个答案实体框架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”项变为第一项):

在此处输入图片说明

什么时候:

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

“ c”项变为最后。

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

如果执行此操作,则不是按该属性排序,而是按条件运算符返回的值排序。 因此,每条记录都会获得一个“排序值”,并且列表将按以下顺序排序:

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>使用,请使用Enumerable.OrderBy() ,其排序保证是“稳定的”

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

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

C是正确的,其他所有条件都是错误的,因为没有其他方法可以对它们进行排序,唯一的逻辑方式就是对它们进行“排序”(因此不进行排序)。

打印结果时,它在顶部返回C,然后按放置顺序返回所有其他项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM