如何用C# LinQ Lambda高效获取含最大字段值的对象集合?
使用LINQ Lambda获取Iteration最大值对应的对象集合
问题背景
给定如下C#类:
public class Duo { public int Iteration { get; set; } public string Name { get; set; } }
以及集合:
List<Duo> list = new List<Duo>() { new Duo () {Name = "A", Iteration = 1}, new Duo () {Name = "B", Iteration = 1}, new Duo () {Name = "C", Iteration = 2}, new Duo () {Name = "D", Iteration = 2} };
需求是获取Iteration为集合中最大值的对象集合(示例中期望得到包含C和D的集合)。现有代码:
var items = list.Where(x => x.Iteration == list.Max(y => y.Iteration));
能实现需求,但会遍历集合两次,效率不够理想,希望用GroupBy实现更高效的方案。
解决方案
方法1:使用GroupBy实现
通过按Iteration字段分组,再按分组键(即Iteration值)降序排序,取排序后的第一个分组即可得到目标集合:
var items = list.GroupBy(x => x.Iteration) .OrderByDescending(group => group.Key) .First() .ToList();
这个方案只需要遍历一次集合完成分组,后续的排序和取分组操作基于分组结果执行,相比原方案减少了一次全集合遍历。
方法2:一次遍历的极致高效实现
如果追求最低的内存开销和最快的速度,可以手动遍历一次集合,同时记录当前最大值及对应元素:
if (!list.Any()) { var items = new List<Duo>(); // 空集合场景处理 return; } int maxIteration = list[0].Iteration; List<Duo> result = new List<Duo> { list[0] }; foreach (var item in list.Skip(1)) { if (item.Iteration > maxIteration) { maxIteration = item.Iteration; result.Clear(); result.Add(item); } else if (item.Iteration == maxIteration) { result.Add(item); } }
这种方式仅遍历集合一次,无需额外分组操作,适合处理大数据量的集合场景。
内容的提问来源于stack exchange,提问作者Ceres
相关产品推荐
相关产品推荐

