我正在使用LINQ,我想使用我的数据库表中的一列来订购列表。问题是我想通过他们的分支机构订购一个人员列表,但是我想按照一定的顺序放置分支机构。
现在我正在使用它:
phoneList.OrderBy(e => e.Branch).ThenBy(e => e.FullName)
说我有这些分支机构:82pk,corp,prfe,hrbd。
我当前的代码将按此分支顺序对人员进行排序:82pk,corp,hrbd,prfe
我想按照这个分支顺序对人员进行排序:corp,82pk,prfe,hrbd
如何根据我的特定订单使用LINQ手动订购我的列表?
这就是我想要完成的事情:
phoneList.OrderBy(e => e.Branch == corp).ThenBy(e => e.Branch == 82pk).ThenBy(e => e.Branch == prfe).ThenBy(e => e.Branch == hrbd)
答案 0 :(得分:2)
从您需要的订单数组开始
var branchOrder = new[]{"corp","82pk","prfe","hrbd"};
然后按此列表中的索引位置排序:
phoneList.OrderBy(e => branchOrder.IndexOf(e.Branch)).ThenBy(e => e.FullName);
这具有额外的好处,即使使用EF查询,它也能按预期工作。
随着项目数量的增长,这将变慢,如评论中所述,存在一个简单的增强功能,可以在字典中存储“分支”和所需的顺序。
var branchOrder = new Dictionary<string,int>(){
{"corp",1},
{"82pk",2},
... etc
}
phoneList.OrderBy(
e => branchOrder.ContainsKey(e.Branch)
? branchOrder[e.Branch]
: 0) // give a default to protect against invalid key
.ThenBy(e => e.FullName);
答案 1 :(得分:0)
让您的Branch-class使用您描述的逻辑实现IComparable。 Linq的OrderBy将根据您的需要排序。