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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:22:51