MrC*_*lan 5 .net c# linq sorting
我没想到这会如此罕见,但看起来确实如此。情况是这样的。
我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
两个问题:
1) 方法似乎不必要地长(if 和 else 块内的代码非常相似)。
2)我希望能够使用多列进行排序。sortBy 参数可以具有诸如“名称、标题、创建日期、状态”之类的值。因此,应用的排序应该是,首先按名称,然后按标题,然后按创建日期......等等。我可以通过顺序检查参数来使用thenBy 。但是如何根据参数值动态应用一系列ThenBy (s),其中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)
Run Code Online (Sandbox Code Playgroud)
我该怎么做?另外,我还如何使用 sortOrder 参数在同一行中按升序或降序排序,而不是使用 if-else。
您可以创建Func<string, IComparable>映射到类属性的字典。
public class ItemWithProperty
{
public string Property { get; set; }
}
public static void Main()
{
Dictionary<string, Func<ItemWithProperty, IComparable>> stringPropertyMap = new Dictionary<string, Func<ItemWithProperty, IComparable>>()
{
{"param1", item => item.Property}
};
List<ItemWithProperty> toBeOrdered = new List<ItemWithProperty>();
string[] parameters = {"param1"};
var sorted = toBeOrdered.OrderBy(stringPropertyMap[parameters[0]]);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4281 次 |
| 最近记录: |