我遇到了这个答案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”项成为第一项):
以及何时:
var orderedFoos = foos.OrderBy(f => f.Val2 == "c" ? 3 : 1).ToList();
“c”项目成为最后一项。
我使用了具有不同属性的多个值,但是没有注意到模式
答案 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,然后按照您输入的顺序返回所有其他项目。