Home > Software design >  Access items in list pertaining to GroupBy() item
Access items in list pertaining to GroupBy() item

Time:09-28

I am instantiating a List, derived from an ObservableCollection:

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

Which, through a foreach loop, gives me access to the various distinct values in LicenseHolderID.

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

What I need help with:

How can I obtain access to the other items in paidTrips, which pertain to LicenseHolderID? (Why: I am creating invoices, one per LicenseHolderID, and I am building the invoice with the data from all the other collection properties).

To give some context, here's the full collection I am working with:

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(),
});

CodePudding user response:

If I understand you correctly, you want to access each group member's property. To achieve this, you should use nested foreach to traverse each group and access its members.

    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);
        }
    }

CodePudding user response:

foreach (var licenseHolder in paidTrips) {
    // accessing the string value of LicenseHolderID
    if (licenseHolder.Key == desiredLicenseHolderID){
       foreach (var paidItem in licenseHolder){
          paidItem.VehicleID = .......
       }
    }        
}

The .GrouBy() Returns a IGrouping object which contains the Key and the elements grouped by the key. To access the elements of the Key grouping you are after once you iterated through the items and found the one, you can simply iterate through the item as an array.

CodePudding user response:

It does depend what your looking to do with the data for each invoice? are you looking to summarise the data within each LicenseHolderID group?

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
  
}

or as above iterate through each group item and access it in singular form.

  • Related