The main idea is to work on specific data.
So, if you have a product, its price and tax rate for each product code, i'd suggest to create 2 classes:
public class PTax
{
public string PCode { get; set; }
public double TaxRate { get; set; }
}
public class PPrice
{
public PTax PTax { get; set; }
public double Netto { get; set; }
public double Brutto
{
get => Netto * PTax.TaxRate;
}
}
Usage:
System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CreateSpecificCulture("pl-PL");
List<PTax> prodTax = new List<PTax>()
{
new PTax{PCode = "A", TaxRate = 1.00},
new PTax{PCode = "B", TaxRate = 1.08},
new PTax{PCode = "C", TaxRate = 1.23}
};
List<PPrice> prodPrice = new List<PPrice>()
{
new PPrice(){PTax = prodTax[0], Netto = 110.00},
new PPrice(){PTax = prodTax[0], Netto = 200.00},
new PPrice(){PTax = prodTax[0], Netto = 5.50},
new PPrice(){PTax = prodTax[1], Netto = 500.00},
new PPrice(){PTax = prodTax[1], Netto = 1180.15},
new PPrice(){PTax = prodTax[2], Netto = 333.33},
new PPrice(){PTax = prodTax[2], Netto = 2000.00}
};
Console.WriteLine("List of products and their prices:");
foreach(PPrice pp in prodPrice)
Console.WriteLine($"Product: '{pp.PTax.PCode}'\tNet. price: {pp.Netto.ToString("C2", ci)}\tBrutto: {pp.Brutto.ToString("C2", ci)}");
var sumy = prodPrice
.GroupBy(x => x.PTax.PCode)
.Select(grp => new
{
PCode = grp.Key,
Count = grp.Count(),
Netto = grp.Sum(x=> x.Netto),
Tax = grp.Select(x=> x.PTax.PCode).FirstOrDefault(),
Brutto = grp.Sum(x=> x.Brutto)
})
.ToList();
Console.WriteLine("\nSum of products based on product code:");
foreach(var p in sumy)
Console.WriteLine($"Product: '{p.PCode}'\tCount:{p.Count}\tNet. price:{p.Netto.ToString("C2", ci)}\tBrutto:{p.Brutto.ToString("C2", ci)}");
Result:
List of products and their prices:
Product: 'A' Net. price: 110,00 zł Brutto: 110,00 zł
Product: 'A' Net. price: 200,00 zł Brutto: 200,00 zł
Product: 'A' Net. price: 5,50 zł Brutto: 5,50 zł
Product: 'B' Net. price: 500,00 zł Brutto: 540,00 zł
Product: 'B' Net. price: 1 180,15 zł Brutto: 1 274,56 zł
Product: 'C' Net. price: 333,33 zł Brutto: 410,00 zł
Product: 'C' Net. price: 2 000,00 zł Brutto: 2 460,00 zł
Sum of products based on product code:
Product: 'A' Count:3 Net. price:315,50 zł Brutto:315,50 zł
Product: 'B' Count:2 Net. price:1 680,15 zł Brutto:1 814,56 zł
Product: 'C' Count:2 Net. price:2 333,33 zł Brutto:2 870,00 zł
Good luck!