LINQ按多字段分组计算分组内单辆车Km加权占比的实现问题
问题原因
你的现有代码的问题在于:GroupBy返回的每个分组是包含该组全部Car实例的集合,你直接对分组做外层Select仅能拿到分组的公共键,无法直接获取组内单条数据的Km值,也会导致每个分组仅生成一条CarDetail,不符合需求。
实现思路
- 按Colour、Make、Model三个字段分组后,先计算当前分组的总Km(仅计算一次,避免重复计算损耗性能)
- 对每个分组内的所有
Car实例做二次投影,为每辆车生成对应的CarDetail对象 - 用
SelectMany把所有分组的投影结果打平为一维的List<CarDetail> - 计算占比时注意规避整数除法的截断问题
正确代码实现
List<CarDetail> carDetails = cars .GroupBy(x => new { x.Colour, x.Make, x.Model }) .SelectMany(group => { // 计算当前分组总里程 decimal totalGroupKm = group.Sum(c => c.Km); // 为组内每辆车生成CarDetail实例 return group.Select(car => new CarDetail { // 可按需保留原车辆的Id、Km等字段 Id = car.Id, Colour = group.Key.Colour, Make = group.Key.Make, Model = group.Key.Model, // 转成decimal避免整数除法得到0的错误结果 WeightedKm = (decimal)car.Km / totalGroupKm }); }) .ToList();
补充说明
如果需要把WeightedKm转成百分比格式展示,可以在赋值时添加格式化逻辑,比如WeightedKm = ((decimal)car.Km / totalGroupKm).ToString("P2")即可得到保留两位小数的百分比结果。
内容的提问来源于stack exchange,提问作者bbb android
相关产品推荐
相关产品推荐

