c# - 如何根据用户输入在 LINQ 中使用 OrderBy 和 ThenBy?

标签 c# linq

我在页面上有一个网格,我想同时在多个列上进行排序。

例如:

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/

相关文章:

c# - LINQ 传递 UTC 日期还是使用 DateTime.UtcNow?

c# - 比较两个列表

c# - 使用 linq 从字符串中提取对象列表

c# - Linq 性能 : does it make sense to move out condition from query?

c# - XML 到 XSL-FO C#.NET

c# - 如何从值类型 T 的 List<List<T>> 中删除重复项?

c# - Random.Next 不是线程安全的并且在 .netcore 中返回 0

c# - 如何使用 IPropertyNotifySink 触发从 C# 到 COM 的属性更改通知?

c# - 在卷纸上打印

c# - LINQ 到 XML : handling nodes that do not exist?