【问题标题】:Access items in list pertaining to GroupBy() item访问与 GroupBy() 项目有关的列表中的项目
【发布时间】:2021-11-20 12:36:46
【问题描述】:

我正在实例化一个List,派生自ObservableCollection

var paidTrips = PaidTrips
    .GroupBy(p => new {p.LicenseHolderID})
    .ToList();

通过foreach 循环,我可以访问LicenseHolderID 中的各种不同值。

foreach (var licenseHolder in paidTrips) {
    // accessing the string value of LicenseHolderID
    // but no access to the other items
}

我需要什么帮助:

我如何才能访问paidTrips 中与LicenseHolderID 相关的其他项目? (为什么:我正在创建发票,每个 LicenseHolderID 一张,并且我正在使用来自所有其他集合属性的数据构建发票)。

为了提供一些背景信息,这是我正在使用的完整集合:

PaidTrips.Add(new PaidTrip {

    LicenseHolderID = dr[0].ToString(),
    VehicleID = dr[1].ToString(),
    Year = dr[2].ToString(),
    Month = dr[3].ToString(),
    Payment = (decimal)dr[4],
    PaymentNet = (decimal)dr[5],
    OrderFee = (decimal)dr[6],
    PaymentFee = (decimal)dr[7],
    TripVATcode = (decimal)dr[8],
    LicenseHolderInvoiceID = dr[9].ToString(),
    TripFeeNet = (decimal)dr[10],
    TripFeeVATcode = (decimal)dr[11],
    RidelRegionInvoiceID = dr[12].ToString(),
});

【问题讨论】:

  • 不太清楚您要达到的目标。 “获得对该集合中其他项目的访问权限”是什么意思?您指的是哪个系列?
  • 供参考 C# 中的 .GroupBy() 返回一个对象,该对象按键对项目列表进行分组。因此,例如,如果您想访问特定 licenseHolderID 的所有“PaidTrip”项目,您可以选择 paidTrips.Where(w => w.Key == licenseHolderID),或者不进行分组并使用 PaidTrips.Where(w => w.licenseHolderID == licenseHolderID)

标签: c# list foreach ienumerable observablecollection


【解决方案1】:

这确实取决于您希望如何处理每张发票的数据?您是否要汇总每个 LicenseHolderID 组中的数据?

var PaidTrips = new List<PaidTrip>();

var paidTrips = PaidTrips
    .GroupBy(p => new { p.LicenseHolderID })
    .ToList();

foreach (var group in paidTrips)
{
    var licenseHolderID = group.Key.LicenseHolderID;
    
    //ie here total payment (This sums all payments for this LicenseHolderID)
    var totalPayment = group.Sum(x => x.Payment)

   // count of payments made (This Counts all Payments greater than 0)
   var totalPayments = group.Count(x => x.Payment > 0)

   //Use variables in your invoice generation
  
}

或如上所述遍历每个组项并以单数形式访问它。

【讨论】:

  • 你又来救我了,兄弟——非常感谢!这对我有用。让我的一周轻松多了。是的,我确实需要所有Payment 的总和,等等。但我也需要每一行的总和。我将如何访问它? (如果这引出了一个新问题,请告诉我——我会创建一个)
  • 一组包含多个具有相同 LicenseHolderID 的行,每行包含多个组件。 .Sum 方法用于对多行中的一个属性求和。在这种情况下,基于一个 LicenseHolderID。您可以将两个求和结果加在一起,或者如果您需要每行,则需要在其中嵌套另一个 foreach 循环,该循环遍历每一行。即foreach(var innerGroup in group)
  • 感谢您一直以来的帮助。假设我想将所有 Payment 行作为一个数组取出(我猜,使用 ToArray 扩展方法,我以后可以对其进行排序,那会是什么样子?foreach (var innerGroup in group) { decimal payment = group.ToArray /* what goes here*/ }
  • 如果您想从其中一个组迭代中选择“属性”付款,您可以使用 select 方法。即 var paymentArray = group.Select(x => x.Payment).ToList();这将导致迭代中该组的特定 LicenseHolderID 键的值列表。
  • 如果您在组内嵌套了一个 innerGroup,您应该只有一个 Payment 值。 innerGroup 变量应该是付费旅行的一个对象。每个属性都可以像这样访问,innerGroup.Payment 或 innerGroup.PaymentNet。如果要从基于 LicenseHolderID 的组中获取 Payment 属性列表,请在外部组中运行它。就像上面的答案一样,只需添加 var paymentReturned = group.Select(x => x.Payment).ToList();可以使用 for 循环和索引访问每个项目值。即 var valueFound = paymentReturned[0] 或 foreach 循环
【解决方案2】:

如果我理解正确,您希望访问每个组成员的属性。为此,您应该使用嵌套的 foreach 遍历每个组并访问其成员。

    var PaidTrips = new List<PaidTrip>();

    var paidTrips = PaidTrips
        .GroupBy(p => new { p.LicenseHolderID })
        .ToList();

    foreach (var group in paidTrips)
    {
        var licenseHolderID = group.Key.LicenseHolderID;

        foreach (var paidTrip in group.ToList())
        {
            Console.WriteLine(paidTrip.TripFeeNet);
        }
    }

【讨论】:

    【解决方案3】:
    foreach (var licenseHolder in paidTrips) {
        // accessing the string value of LicenseHolderID
        if (licenseHolder.Key == desiredLicenseHolderID){
           foreach (var paidItem in licenseHolder){
              paidItem.VehicleID = .......
           }
        }        
    }
    

    .GrouBy() 返回一个 IGrouping 对象,其中包含键和按键分组的元素。要访问 Key 分组的元素,一旦您遍历项目并找到该元素,您可以简单地将项目作为数组进行迭代。

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      相关资源
      最近更新 更多