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

如何根据条件选择使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:20:14