如何使用Linq对时间条目列表分组求和并计算耗时占比?
实现方法
Linq本身没有内置专门计算分组占比的语法,你可以通过提前计算全量集合总耗时的方式实现,该方案仅需遍历一次集合计算总和,性能最优,不会产生重复计算的开销:
// 提前计算所有时间条目的总耗时 float totalHours = timeEntries.Sum(entry => entry.HoursSpent); var activitiesWithSpentHours = timeEntries .GroupBy(timeEntry => timeEntry.ActivityName) .Select(activityGroup => { float groupHours = activityGroup.Sum(timeEntry => timeEntry.HoursSpent); return new { Activity = activityGroup.Key, HoursSpent = groupHours, // 计算百分比,第二个参数可按需调整保留的小数位数,不需要保留小数传0即可 Percentage = totalHours == 0 ? 0 : Math.Round(groupHours / totalHours * 100, 2) }; });
注意事项
- 代码中增加了总耗时为0的判断,避免出现除零异常
- 你原有示例代码中
HoursSpent赋值行末尾缺少逗号,调整代码时请补充该语法符号 - 不要在Select的匿名类内部直接调用
timeEntries.Sum()计算总耗时,否则每处理一个分组都会遍历一次全量集合,时间复杂度会上升到O(n²),集合数据量大时性能损耗非常明显
内容的提问来源于stack exchange,提问作者user13755987
相关产品推荐
相关产品推荐

