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

如何使用System.Linq获取相同itemId对应条目的最高points值

实现方案

前置说明

使用前请确保代码文件顶部已引入System.Linq命名空间:

using System.Linq;

假设你从数据库获取的全量数据已经映射为IEnumerable<ItemRecord>类型的集合,实体定义参考如下:

public class ItemRecord
{
    // 对应数据表的itemId字段
    public string ItemId { get; set; }
    // 对应数据表的points字段
    public int Points { get; set; }
}

模拟你给出的示例数据构造集合参考:

List<ItemRecord> allData = new List<ItemRecord>
{
    new ItemRecord { ItemId = "a1", Points = 50 },
    new ItemRecord { ItemId = "a1", Points = 10 },
    new ItemRecord { ItemId = "b1", Points = 15 }
};

核心Linq实现

方法链写法(最常用)

核心逻辑为:按itemId分组 → 每组内按points降序排序 → 取每组第一条(即points最高的条目)

var resultList = allData
    .GroupBy(item => item.ItemId) // 按itemId分组
    .Select(group => group.OrderByDescending(item => item.Points).First()) // 每组取最高分条目
    .ToList();

如果存在同一个itemId下有多条相同最高分的条目,需要全部返回时,可调整为如下写法:

var resultList = allData
    .GroupBy(item => item.ItemId)
    .SelectMany(group => 
    {
        var maxPoints = group.Max(item => item.Points);
        return group.Where(item => item.Points == maxPoints);
    })
    .ToList();

查询表达式写法(可选)

习惯SQL风格写法可以用如下方式实现,逻辑和方法链完全一致:

var resultList = (from record in allData
                 group record by record.ItemId into g
                 select g.OrderByDescending(item => item.Points).First())
                 .ToList();

输出格式化(匹配你给出的示例输出)

拿到结果集合后,按需求格式化输出即可:

foreach (var item in resultList)
{
    // 示例输出匹配你给出的格式,实际可以统一输出规则
    Console.WriteLine(item.ItemId switch
    {
        "a1" => $"{item.ItemId}, {item.Points} points",
        "b1" => $" {item.ItemId} with {item.Points} points.",
        _ => $"{item.ItemId}, {item.Points} points" // 通用格式
    });
}

内容的提问来源于stack exchange,提问作者Marsh Mellow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:27:04