如何使用LINQ获取包含重复值的前N个最高值对应全部数据?
获取所有拥有前3个最高值的城市的LINQ实现
当城市列表存在重复高值时,需要返回所有属于前3个最高值的城市(而非仅取排序后的前3条数据),可以通过以下方式实现:
方案1:分步实现(可读性&效率更优)
- 先提取列表中前3个不同的最高值并缓存
- 筛选出所有值属于该集合的城市,再按值降序排序
// 提取前3个不同的最高值 var top3DistinctValues = MyList .Select(city => city.Value) .Distinct() .OrderByDescending(val => val) .Take(3) .ToList(); // 筛选并排序结果 var result = MyList .Where(city => top3DistinctValues.Contains(city.Value)) .OrderByDescending(city => city.Value) .ToList();
方案2:合并为单查询
如果偏好简洁的链式写法,可将逻辑合并为一个查询:
var result = MyList .Where(city => MyList .Select(x => x.Value) .Distinct() .OrderByDescending(val => val) .Take(3) .Contains(city.Value)) .OrderByDescending(city => city.Value) .ToList();
结果验证
针对示例中的第二个列表,上述代码会返回所有值为60、50、40的城市,最终结果符合预期:
City Value --------------------- City6 60 City7 60 City5 50 City4 40
(注:若需保持原列表中同值城市的顺序,可在排序时追加ThenBy(city => MyList.IndexOf(city)))
内容的提问来源于stack exchange,提问作者DooDoo
相关产品推荐
相关产品推荐

