如何根据条件选择使用OrderBy或OrderByDescending进行排序?
如何通过条件判断灵活选择OrderBy或OrderByDescending排序?
当然可以,你当前的代码确实存在重复逻辑——升序和降序分支里,除了排序方法不同,提取名称的循环完全一致。我们可以通过以下方式优化,消除重复代码:
优化方案一:三元运算符+LINQ链式调用
public string[] GetCongregationListSortedByDate(bool bSortAscending) { try { // 根据排序方向选择对应的排序方法 var sortedCongregations = bSortAscending ? _CongregationData.CongregationDictionary.OrderBy(x => x.Value.LastInvited) : _CongregationData.CongregationDictionary.OrderByDescending(x => x.Value.LastInvited); // 统一提取名称并转成数组,省去重复的foreach循环 return sortedCongregations.Select(kvp => kvp.Value.Name).ToArray(); } catch (Exception ex) { SimpleLog.Log(ex); return null; } }
优化方案二:委托复用排序逻辑
如果后续有更复杂的排序场景需要复用逻辑,可以用委托来封装排序方法:
public string[] GetCongregationListSortedByDate(bool bSortAscending) { try { // 根据排序方向赋值对应的排序委托 Func<IEnumerable<KeyValuePair<int, Congregation>>, Func<KeyValuePair<int, Congregation>, DateTime>, IOrderedEnumerable<KeyValuePair<int, Congregation>>> sortMethod = bSortAscending ? Enumerable.OrderBy : Enumerable.OrderByDescending; // 统一调用排序委托 var sortedCongregations = sortMethod(_CongregationData.CongregationDictionary, x => x.Value.LastInvited); return sortedCongregations.Select(kvp => kvp.Value.Name).ToArray(); } catch (Exception ex) { SimpleLog.Log(ex); return null; } }
优化说明
- 两种方案都消除了重复的循环和集合初始化代码,让逻辑更简洁
- 不需要提前调用
ToList(),LINQ的延迟执行特性会在调用ToArray()时才完成排序和数据提取,性能更高效 - 核心思路是把变化的部分(排序方向)和不变的部分(提取名称)分离,避免重复代码
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

