在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
相关产品推荐
相关产品推荐

