使用LINQ对对象列表的特定排序

时间:2014-11-24 17:48:29

标签: c# linq

我正在使用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)

2 个答案:

答案 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将根据您的需要排序。