C#如何将指定条件对象移至List顶部?求更优实现方案
优化方案:单遍历将指定元素移至列表顶部
你的现有实现会通过两次Where查询遍历列表两次,这里提供两种更高效的单遍历优化方案:
方案1:一次遍历分组处理
通过一次遍历把元素分成匹配组和非匹配组,再合并结果,避免重复遍历:
List<AppointmentDTO> res = await this.appointmentService.GetCanReserve(coachId, date); var id = HttpContext.User.FindFirst("id")?.Value; if (id is not null) { var matches = new List<AppointmentDTO>(); var nonMatches = new List<AppointmentDTO>(); foreach (var item in res) { if (item.Coach.Id == id) { matches.Add(item); } else { nonMatches.Add(item); } } matches.AddRange(nonMatches); res = matches; }
这种方式仅遍历原列表一次,内存开销和原方案相近,但减少了一次遍历的性能消耗,同时能保留匹配元素和非匹配元素各自的原有相对顺序。
方案2:利用布尔值排序(代码更简洁)
借助C#排序中布尔值的特性(true优先级高于false),用OrderByDescending实现一行代码调整顺序:
List<AppointmentDTO> res = await this.appointmentService.GetCanReserve(coachId, date); var id = HttpContext.User.FindFirst("id")?.Value; if (id is not null) { res = res.OrderByDescending(r => r.Coach.Id == id).ToList(); }
该方案代码更简洁,底层实现同样是一次遍历相关的稳定排序操作,能保留原列表中元素的相对顺序,性能和方案1接近,适合追求代码简洁性的场景。
内容的提问来源于stack exchange,提问作者lyj
相关产品推荐
相关产品推荐

