You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LINQ按多字段分组计算分组内单辆车Km加权占比的实现问题

问题原因

你的现有代码的问题在于:GroupBy返回的每个分组是包含该组全部Car实例的集合,你直接对分组做外层Select仅能拿到分组的公共键,无法直接获取组内单条数据的Km值,也会导致每个分组仅生成一条CarDetail,不符合需求。

实现思路

  1. 按Colour、Make、Model三个字段分组后,先计算当前分组的总Km(仅计算一次,避免重复计算损耗性能)
  2. 对每个分组内的所有Car实例做二次投影,为每辆车生成对应的CarDetail对象
  3. 用SelectMany把所有分组的投影结果打平为一维的List<CarDetail>
  4. 计算占比时注意规避整数除法的截断问题

正确代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:45:02