You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中能否通过OrderBy结合布尔值对IEnumerable进行排序?

实现按布尔值控制C#集合排序方向的单行写法

修改C# List(或任意Enumerable)的排序方向通常有两种方式:

  • 使用OrderByDescending()方法
  • 在排序操作后追加.Reverse()

我代码里存在大量如下逻辑:

if (bDirection)
  list.OrderBy(...);
else
  list.OrderByDescending(...);

希望将其替换为一行代码,用布尔值bDirection直接控制排序方向,比如:

list.OrderBy(..., bDirection);

请问是否存在这样的实现方式?


实现方案

1. 自定义扩展方法(推荐)

自己封装一个支持排序方向参数的OrderBy扩展方法,就能完全按照你想要的语法调用:

public static class EnumerableExtensions
{
    // 基础重载
    public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
        this IEnumerable<TSource> source,
        Func<TSource, TKey> keySelector,
        bool ascending)
    {
        return ascending ? source.OrderBy(keySelector) : source.OrderByDescending(keySelector);
    }

    // 带比较器的重载
    public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
        this IEnumerable<TSource> source,
        Func<TSource, TKey> keySelector,
        IComparer<TKey> comparer,
        bool ascending)
    {
        return ascending ? source.OrderBy(keySelector, comparer) : source.OrderByDescending(keySelector, comparer);
    }
}

调用示例:

// 基础用法
var sorted = list.OrderBy(item => item.Id, bDirection);
// 带自定义比较器的用法
var sortedIgnoreCase = list.OrderBy(item => item.Name, StringComparer.OrdinalIgnoreCase, bDirection);

2. 直接使用三元运算符

如果不想写扩展方法,也可以用三元运算符在行内完成判断,实现单行代码效果:

var sorted = bDirection ? list.OrderBy(item => item.Id) : list.OrderByDescending(item => item.Id);

这两种方式都能消除重复的if-else逻辑,让代码更简洁易读。


内容的提问来源于stack exchange,提问作者Dominique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:23:31