如何用单个LINQ表达式获取指定年份各月份列最大值并生成单行结果
用单个LINQ表达式实现指定年份月份数据最大值聚合
假设你的Volume类包含YEAR以及JAN_VOLUME到DEC_VOLUME这12个月份的数值属性,你可以通过单个LINQ表达式完成筛选+月份最大值聚合的操作,代码如下:
var monthlyMaxVolumes = volumes .Where(v => v.YEAR == maxYear) .Aggregate( // 初始化每个月份的最大值为对应数值类型的最小值 new { JanMax = int.MinValue, FebMax = int.MinValue, MarMax = int.MinValue, AprMax = int.MinValue, MayMax = int.MinValue, JunMax = int.MinValue, JulMax = int.MinValue, AugMax = int.MinValue, SepMax = int.MinValue, OctMax = int.MinValue, NovMax = int.MinValue, DecMax = int.MinValue }, // 遍历每条数据,逐个更新月份最大值 (accumulator, current) => new { JanMax = Math.Max(accumulator.JanMax, current.JAN_VOLUME), FebMax = Math.Max(accumulator.FebMax, current.FEB_VOLUME), MarMax = Math.Max(accumulator.MarMax, current.MAR_VOLUME), AprMax = Math.Max(accumulator.AprMax, current.APR_VOLUME), MayMax = Math.Max(accumulator.MayMax, current.MAY_VOLUME), JunMax = Math.Max(accumulator.JunMax, current.JUN_VOLUME), JulMax = Math.Max(accumulator.JulMax, current.JUL_VOLUME), AugMax = Math.Max(accumulator.AugMax, current.AUG_VOLUME), SepMax = Math.Max(accumulator.SepMax, current.SEP_VOLUME), OctMax = Math.Max(accumulator.OctMax, current.OCT_VOLUME), NovMax = Math.Max(accumulator.NovMax, current.NOV_VOLUME), DecMax = Math.Max(accumulator.DecMax, current.DEC_VOLUME) });
代码说明:
- 先通过
Where筛选出年份等于maxYear的所有数据; - 用
Aggregate方法做累积计算:- 初始值创建一个匿名对象,每个月份的最大值字段设为对应数值类型的最小值(如果是浮点型就用
double.MinValue, decimal类型用decimal.MinValue); - 遍历每条筛选后的数据,用
Math.Max对比当前累积的最大值和当前数据的月份值,更新累积对象的对应字段;
- 初始值创建一个匿名对象,每个月份的最大值字段设为对应数值类型的最小值(如果是浮点型就用
- 最终得到的
monthlyMaxVolumes就是包含12个月份最大值的单行结果。
内容的提问来源于stack exchange,提问作者O.O
相关产品推荐
相关产品推荐

