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
相关产品推荐
相关产品推荐

