如何用单条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();
逻辑说明
- 获取目标项:通过
Select转换为SortTarget类型,再按edited_date(为空则用created_date)降序排序取第一条,还原第一段代码的筛选逻辑。 - 过滤空值:用
Where排除storeList为空时产生的null结果,避免无效元素混入最终列表。 - 拼接分页列表:先执行第二段的排序、分页、类型转换逻辑,再通过
Where过滤掉与目标项重复的元素,最后用Concat将目标项固定在列表最顶部,后续元素保持第二段的排序结果。
如果追求更高性能(避免重复计算目标项ID),可以将目标项的计算逻辑提取为临时变量,但这会拆分语句;若严格要求单条链式语句,上述代码完全满足需求。
内容的提问来源于stack exchange,提问作者Aroueterra
相关产品推荐
相关产品推荐

