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

C# 如何访问GroupBy分组后关联LicenseHolderID的其他集合项

你调用GroupBy方法后得到的paidTrips列表中,每个元素都是IGrouping<TKey, TElement>类型的分组对象:它的Key属性存储你指定的分组键,同时它本身实现了IEnumerable<PaidTrip>接口,包含当前分组下所有关联的PaidTrip实例,直接遍历即可访问所有属性。

基础用法示例

foreach (var licenseHolderGroup in paidTrips) 
{
    // 获取当前分组的LicenseHolderID
    var currentLicenseId = licenseHolderGroup.Key.LicenseHolderID;

    // 方案1:遍历当前分组下所有行程记录,访问任意属性
    foreach (var trip in licenseHolderGroup)
    {
        var vehicleId = trip.VehicleID;
        var year = trip.Year;
        var payment = trip.Payment;
        // 其余属性都可以直接通过trip对象访问
    }

    // 方案2:直接做聚合计算,适合生成发票时统计汇总数据,无需二次遍历
    var totalPayment = licenseHolderGroup.Sum(t => t.Payment);
    var totalPaymentNet = licenseHolderGroup.Sum(t => t.PaymentNet);
    var totalOrderFee = licenseHolderGroup.Sum(t => t.OrderFee);
    // 用以上聚合数据直接生成对应ID的发票即可
}

优化建议

你当前是按单个字段LicenseHolderID分组,不需要用匿名类型作为分组键,简化写法如下:

var paidTrips = PaidTrips
    // 直接用LicenseHolderID字符串作为分组键
    .GroupBy(p => p.LicenseHolderID)
    .ToList();

优化后取分组键的代码可以简化为var currentLicenseId = licenseHolderGroup.Key;,不用再额外访问.LicenseHolderID属性。

进阶:提前投影发票所需数据

如果需要提前把发票用到的所有数据整理好,可以在分组后直接投影为自定义对象,减少后续遍历逻辑:

var invoiceGroups = PaidTrips
    .GroupBy(p => p.LicenseHolderID)
    .Select(g => new 
    {
        LicenseHolderID = g.Key,
        // 所有关联的行程明细
        TripDetails = g.ToList(),
        // 提前计算所有汇总字段
        TotalPayment = g.Sum(x => x.Payment),
        TotalPaymentNet = g.Sum(x => x.PaymentNet),
        TotalOrderFee = g.Sum(x => x.OrderFee)
    })
    .ToList();

// 遍历生成发票
foreach (var invoiceData in invoiceGroups)
{
    var licenseId = invoiceData.LicenseHolderID;
    var allTrips = invoiceData.TripDetails;
    var totalAmount = invoiceData.TotalPayment;
    // 直接调用发票生成逻辑即可
}

内容的提问来源于stack exchange,提问作者Ole M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:48:05