10万+元素List分组求均值、最值并保留极值的实现问题
分组统计实现方案
你之前的实现只是等间隔取采样点,没有对分组内的所有元素做聚合统计,无法得到均值、极值这类分组统计结果。针对10万+元素的List场景,推荐以下*O(n)*复杂度的高性能实现:
基础实现(性能最优)
该方案仅遍历原集合1次,无额外内存拷贝开销,10万级数据处理耗时可控制在毫秒级。
1. 定义分组统计结果实体
public class GroupStats { // 可根据你的基础数据类型调整属性类型,比如换成int/decimal public double Average { get; set; } public double Min { get; set; } public double Max { get; set; } }
2. 核心处理逻辑
public List<GroupStats> Calculate100GroupStats(List<double> source) { // 预分配结果容量,避免动态扩容的性能损耗 var result = new List<GroupStats>(100); int totalCount = source.Count; if (totalCount == 0) return result; // 计算每组基础大小,余数均匀分配到前N组,避免最后一组数据量偏差过大 int baseGroupSize = totalCount / 100; int remainder = totalCount % 100; int currentPos = 0; for (int i = 0; i < 100; i++) { int currentGroupSize = baseGroupSize + (i < remainder ? 1 : 0); if (currentGroupSize <= 0) break; double sum = 0; double currentMin = double.MaxValue; double currentMax = double.MinValue; for (int j = 0; j < currentGroupSize; j++) { double val = source[currentPos]; sum += val; if (val < currentMin) currentMin = val; if (val > currentMax) currentMax = val; currentPos++; } result.Add(new GroupStats { Average = sum / currentGroupSize, Min = currentMin, Max = currentMax }); } return result; }
简化LINQ实现(代码量少,适合小数据量场景)
如果数据量不大、追求代码简洁,可以用LINQ分组实现,性能略低于上述遍历方案:
var groupStats = source .Select((val, idx) => new { Val = val, GroupId = idx * 100 / source.Count }) .GroupBy(x => x.GroupId) .Select(g => new GroupStats { Average = g.Average(x => x.Val), Min = g.Min(x => x.Val), Max = g.Max(x => x.Val) }) .ToList();
内容的提问来源于stack exchange,提问作者Michael T
相关产品推荐
相关产品推荐

