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

优化数据库返回数据排序逻辑:替代switch语句的最优方案

优化数据排序逻辑的几种实用方案

你当前使用switch实现的排序逻辑确实存在冗余,尤其是新增排序规则时需要修改分支代码,以下几种方案可以优化这个问题:

1. 字典映射(简洁易维护)

将排序字符串与对应的排序委托映射到字典中,通过键值查找替代分支判断,代码更扁平化,新增规则只需添加字典项:

// 定义排序规则映射
var sortMappings = new Dictionary<string, Func<IQueryable<Book>, IQueryable<Book>>>
{
    ["title"] = books => books.OrderBy(b => b.Title),
    ["novelti_asc"] = books => books.OrderBy(b => b.Date),
    ["novelti_des"] = books => books.OrderByDescending(b => b.Date)
};

// 应用排序,默认按Title排序
books = sortMappings.TryGetValue(sort, out var sortFunc) 
    ? sortFunc(books) 
    : books.OrderBy(b => b.Title);

2. 扩展方法+Switch表达式(优雅解耦)

用C# 8.0的switch表达式替代传统switch,并封装成扩展方法,把排序逻辑从控制器中抽离,提升代码可读性和复用性:

// 扩展方法封装排序逻辑
public static class QueryableSortExtensions
{
    public static IQueryable<Book> SortBy(this IQueryable<Book> books, string sort)
    {
        return sort switch
        {
            "title" => books.OrderBy(b => b.Title),
            "novelti_asc" => books.OrderBy(b => b.Date),
            "novelti_des" => books.OrderByDescending(b => b.Date),
            _ => books.OrderBy(b => b.Title)
        };
    }
}

// 控制器中直接调用
books = books.SortBy(sort);

3. 策略模式(复杂场景首选)

如果后续会有大量复杂排序规则,或者需要动态扩展排序逻辑,策略模式是更合适的选择,每个排序规则对应一个独立类,符合单一职责原则:

定义策略接口与实现类

public interface IBookSortStrategy
{
    IQueryable<Book> ApplySort(IQueryable<Book> books);
    string SortKey { get; }
}

public class TitleSortStrategy : IBookSortStrategy
{
    public string SortKey => "title";
    public IQueryable<Book> ApplySort(IQueryable<Book> books) => books.OrderBy(b => b.Title);
}

public class NoveltyAscSortStrategy : IBookSortStrategy
{
    public string SortKey => "novelti_asc";
    public IQueryable<Book> ApplySort(IQueryable<Book> books) => books.OrderBy(b => b.Date);
}

public class NoveltyDescSortStrategy : IBookSortStrategy
{
    public string SortKey => "novelti_des";
    public IQueryable<Book> ApplySort(IQueryable<Book> books) => books.OrderByDescending(b => b.Date);
}

控制器中使用策略

// 通过依赖注入获取所有排序策略
private readonly IEnumerable<IBookSortStrategy> _sortStrategies;

public BookController(IEnumerable<IBookSortStrategy> sortStrategies)
{
    _sortStrategies = sortStrategies;
}

// 应用排序逻辑
var strategy = _sortStrategies.FirstOrDefault(s => s.SortKey == sort) 
               ?? new TitleSortStrategy();
books = strategy.ApplySort(books);

方案选择建议

  • 简单场景(排序规则少、逻辑简单):优先选字典映射或扩展方法+Switch表达式,代码简洁易实现;
  • 复杂场景(排序规则多、逻辑复杂或需要动态扩展):选策略模式,便于维护和扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:43:34