LINQ - 明确使用 OrderBy

3

可以像这样使用LINQ OrderBy吗:

.OrderBy(x=>(x.SourceID == 3), (x.SourceID == 2), (x=>x.SourceID == 4), (x.SourceID == 1)).ToList();

所以它会按3、2、4、1的顺序对它们进行排序吗?

我从来不知道 OrderBy 有这样的扩展。 - Bastardo
它本身没有,但是有类似的东西可以用来显式地对复杂数据类型的列表进行排序吗? - CallumVass
我真的不知道在这种情况下explicitly是什么意思,我的知识匮乏,抱歉,但是你要找的是ThenBy吗?请查看https://dev59.com/z3VC5IYBdhLWcg3wbgdS#298741。你想做的基本上是“LINQ中的多重排序”,不是吗?请查看https://dev59.com/z3VC5IYBdhLWcg3wbgdS。 - Bastardo
那么,Orderby(x=>x.SourceID == 3).ThenBy(x=>x.SourceID == 2).ThenBy(x=>X.SourceID == 4)...? - CallumVass
2个回答

7
不,那不是一个有效的lambda表达式。你可以尝试以下方法:
var sortOrder = new List<int> {3, 2, 4, 1};
var result = bop.OrderBy(x=> sortOrder.IndexOf(x.SourceID)).ToList();

如果您想将其扩展到对未知项执行特殊操作(它们现在首先出现),您只需创建一个方法来确定排序顺序并使用该方法即可。


当我尝试这个的时候,出现了以下错误:LINQ to Entities 不识别方法 'Int32 IndexOf(Int32)',而此方法无法转换为存储表达式。 - CallumVass
啊,那么你的Linq提供程序(Linq2NHibernate?Linq2Entities?)不支持IndexOf。底层的Linq提供程序是什么? - Joachim Isaksson
你的程序使用NHibernate还是Entity Framework(EF)?无论哪种方式,如果这是你从数据库中获取的唯一内容而没有太多其他复杂性,你可以在排序之前将其提取到内存中,方法是bop.ToList().OrderBy(...),这应该适用于任何提供程序。 - Joachim Isaksson
那我应该这样做 bop.ToList().OrderBy(x=> sortOrder.IndexOf(x.SourceID)); 吗? - CallumVass

2
采用Joachim Isaksson的上面的回答,这可以被封装在一个扩展方法中:
public static class ListExtensions
{
    public static List<Source> SortByCustomOrder(this List<Source> list, List<int> sortOrder)
    {
        return list.OrderBy(x => sortOrder.IndexOf(x.SourceId)).ToList();
    }
}

将“Source”替换为您的类名,“x.SourceId”替换为您的属性名。

用法:

// the sort order
var sortOrder = new List<int> { 3, 2, 4, 1, 6, 5 };
var results = sources.SortByCustomOrder(sortOrder);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接