【发布时间】:2015-03-14 22:35:06
【问题描述】:
我不认为这会如此罕见,但看起来确实如此。情况是这样的。
我有一个 ApplySort 方法,它接受从 mvc 页面发布的 3 个参数。
private List<dynamic> ApplySort(List<dynamic> listToBeSorted, string sortBy, string sortOrder)
{
if (String.IsNullOrEmpty(sortBy))
sortBy = "createddate";
if (String.IsNullOrEmpty(sortOrder) || sortOrder.Trim() != "0")
sortOrder = "1"; // 1 = descending, 0 = ascending
if (sortOrder == "1")
{
switch (sortBy)
{
case "name":
listToBeSorted = listToBeSorted.OrderByDescending(a => a.name).ToList();
break;
case "assigned":
listToBeSorted = listToBeSorted.OrderByDescending(a => a.title).ToList();
break;
case "duedate":
listToBeSorted = listToBeSorted.OrderByDescending(a => a.end).ToList();
break;
case "status":
listToBeSorted = listToBeSorted.OrderByDescending(a => a.title).ToList();
break;
default:
listToBeSorted = listToBeSorted.OrderByDescending(a => a.title).ToList();
break;
}
}
else
{
// same code as in if-block, with just OrderBy calls instead of OrderByDescending
}
return listToBeSorted;
}
两个问题:
1) 方法似乎过长(if 和 else 块中的代码非常相似)。
2) 我希望能够使用多个列进行排序。 sortBy 参数可以具有诸如“名称、标题、创建日期、状态”之类的值。所以应用的排序应该是,首先按名称,然后按标题,然后按创建日期......等等。 我可以通过顺序检查参数来使用 ThenBy。 但是如何根据参数值动态应用 ThenBy 链,其中 ThenBy 的数量可以变化。
string[] sortParams = sortBy.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
listToBeSorted.OrderBy(i=>i.sortParams[0]).ThenBy(j=>j.sortParams[1]).ThenBy(k=>k.sortParams[2])...(so on till sortParams.length)
我该怎么做?另外,如何使用 sortOrder 参数在同一行中按升序或降序进行排序,而不是使用 if-else。
【问题讨论】:
-
谷歌搜索“Dlinq”,它可以让你做
.ThenBy(new string[])。 -
不是完全重复,但this answer 可能会给你一些启发。它使用枚举而不是字符串来定义搜索属性,但这应该不是问题。
-
对于您的场景,似乎拥有一个属性名称字典和相应的 lambda 应该可以帮助您消除所有冗余。