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

如何用单条LINQ链式语句将指定排序结果置顶后按规则排序?

解决方案

可以通过单条LINQ链式语句实现需求,核心思路是先获取目标SortTarget,再将其与分页后的列表(过滤掉重复的目标项)拼接,全程无需修改原集合或手动处理重复项:

var result = storeList
    // 获取优先级最高的SortTarget(对应第一段逻辑)
    .Select(x => new SortTarget { Id = x.id, store = x.store })
    .OrderByDescending(x => 
        storeList.FirstOrDefault(y => y.id == x.Id)?.edited_date 
        ?? storeList.FirstOrDefault(y => y.id == x.Id)?.created_date)
    .Take(1)
    // 过滤掉可能的null结果(当storeList为空时)
    .Where(target => target != null)
    // 拼接分页后的列表(对应第二段逻辑,并排除已存在的目标项)
    .Concat(storeList
        .OrderBy(y => y.id)
        .ThenBy(z => z.store)
        .Skip(skip)
        .Take(take)
        .Select(x => new SortTarget { Id = x.id, store = x.store })
        .Where(item => 
            item.Id != storeList
                .Select(y => new { y.id, SortKey = y.edited_date ?? y.created_date })
                .OrderByDescending(y => y.SortKey)
                .FirstOrDefault()?.id))
    .ToList();

逻辑说明

  1. 获取目标项:通过Select转换为SortTarget类型,再按edited_date(为空则用created_date)降序排序取第一条,还原第一段代码的筛选逻辑。
  2. 过滤空值:用Where排除storeList为空时产生的null结果,避免无效元素混入最终列表。
  3. 拼接分页列表:先执行第二段的排序、分页、类型转换逻辑,再通过Where过滤掉与目标项重复的元素,最后用Concat将目标项固定在列表最顶部,后续元素保持第二段的排序结果。

如果追求更高性能(避免重复计算目标项ID),可以将目标项的计算逻辑提取为临时变量,但这会拆分语句;若严格要求单条链式语句,上述代码完全满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:09:53