如何使用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
相关产品推荐
相关产品推荐

