我有一个方法可以对客户列表进行排序。
我想要排序的参数有两个。
我很清楚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方法,但我认为必须有一种更简单的方法。
我希望你的问题是正确的。我不确定我是否能够解释得足够好......
的问候, 埃里克
答案 0 :(得分:2)
因为问题是决定放入OrderBy
的lambda(而不是其他lambdas,进入ThenBy
)你可以使用一个小技巧,并把你所有的lambdas (如果没有要进行排序,则没有lambdas)到ThenBy
。由于ThenBy
是IOrderedEnumerable<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();