我在页面上有一个网格,我想同时在多个列上进行排序。
例如:
UserID FirstName LastName
=======================================
1 Bruce Wayne
2 Peter Parker
3 Clark Kent
4 Tony Stark
5 Helena Wayne
用户可以选择按 LastName ASC 排序,然后按 FirstName DESC 排序,这将产生以下结果:
UserID FirstName LastName
=======================================
3 Clark Kent
2 Peter Parker
4 Tony Stark
5 Helena Wayne
1 Bruce Wayne
用户可以重新排序并决定以其他方式进行排序。
如何在 LINQ 中实现这一点?据我所知,链式排序的方式是做类似
的事情superheroes.OrderBy(x => x.LastName).ThenByDescending(x => x.FirstName)
显然,我不想写出所有可能的列顺序组合(我的网格最多可能有 10 列)。有什么方法可以使排序顺序动态化吗?
最佳答案
IEnumerable 的一种天真的方法(不完美或经过测试,但你明白了)。我把开关放在外面,这样比较只进行一次,而不是每次调用选择器时都进行比较。有点难看,因为您基本上必须在 OrderBy 和 ThenBy 中重复自己。
enum OrderableColumns {UserID, FirstName, ...}
IOrderedEnumerable<SuperHero> OrderBy(SuperHeroes superheroes, OrderableColumns column)
{
switch(column)
{
case UserID:
return superheroes.OrderBy(x => x.UserID);
case FirstName:
return superheroes.OrderBy(x => x.FirstName);
...
}
}
IOrderedEnumerable<SuperHero> ThenBy(IOrderedEnumerable<SuperHero> superheroes, OrderableColumns column)
{
switch(column)
{
case UserID:
return superheroes.ThenBy(x => x.UserID);
case FirstName:
return superheroes.ThenBy(x => x.FirstName);
...
}
}
IOrderedEnumerable<SuperHero> OrderSuperheroes(SuperHeroes superheroes, params OrderableColumns[] columns)
{
var ordered = OrderBy(superheroes, columns[0]);
foreach(var col in columns.Skip(1))
ordered = ThenBy(ordered, col);
return ordered;
}
关于c# - 如何根据用户输入在 LINQ 中使用 OrderBy 和 ThenBy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12137000/