使用两个参数对列表进行排序,但使用不同的代码行

时间:2017-06-05 15:47:40

标签: list linq sorting

我有一个方法可以对客户列表进行排序。

我想要排序的参数有两个。

我很清楚
List.OrderBy(x => x. [...]).ThenBy... 

方法,但我的情况有点不同:

switch(mySortType)
{
     case SortType.mostVisits:
         clients = clients.OrderBy(x => x. and so on...)
     break;
     More cases with different sortTypes
}

之后我想对布尔参数进行排序,但前提是设置告诉方法是通过另一个bool来完成的。 我有办法说出像

这样的话
clients = clients.OrderBy(Current).ThenBy(x => x.param).ToList()?

我当然可以在每种情况下都有一个if()

case SortType.MostVisits:
  if(settingsTellsMeToDoSo)
     clients = clients.OrderBy(x=>x.numberOfVisits).ThenBy(x => x.param).ToList();
  else clients = clients.OrderBy(x => x.numberOfVisits).ToList();

然后使用简单的ThenBy方法,但我认为必须有一种更简单的方法。

我希望你的问题是正确的。我不确定我是否能够解释得足够好......

的问候, 埃里克

2 个答案:

答案 0 :(得分:2)

因为问题是决定放入OrderBy的lambda(而不是其他lambdas,进入ThenBy)你可以使用一个小技巧,并把你所有的lambdas (如果没有要进行排序,则没有lambdas)到ThenBy。由于ThenByIOrderedEnumerable<T>上的扩展方法,因此您需要一种方法,使常规可枚举成为有序枚举,而不会干扰原始顺序。

您可以通过在常量上应用虚拟排序,从IOrderedEnumerable<T>(或IEnumerable<T> IOrderedQueryable<T>,根据您的情况)制作IQueryable<T>,如下所示:

IOrderedEnumerable<Client> orderdClients = list.OrderBy(c => 1);

现在,您可以根据需要重复应用ThenBy。这种方法本质上类似于在处理可能包含零元素的AND操作链时进行虚拟搜索条件。

答案 1 :(得分:1)

我不确定您要简化的是什么,您无法从代码中删除决策,但您可以更好地订购排序语句:

IOrderedEnumerable<Client> orderedClients;

case SortType.MostVisits:
  orderedClients = clients.OrderBy(x => x.numberOfVisits);
  if(settingsTellsMeToDoSo)
      orderedClients = orderedClients.ThenBy(x => x.param);
break;

然后在开关结束后:

clients = orderedClients.ToList();