using System.Collections.Generic;
var invoices = new List<Invoice>
new Invoice("Germany", BillingMethod.Paper, InvoiceCount: 4, CustomerCount: 5, 1234),
new Invoice("Germany", BillingMethod.Electronic, InvoiceCount: 52, CustomerCount: 34, 4567),
new Invoice("Greece", BillingMethod.Paper, InvoiceCount: 8, CustomerCount: 75, 78955),
new Invoice("Denmark", BillingMethod.Paper, InvoiceCount: 32, CustomerCount: 15, 7890),
new Invoice("Norway", BillingMethod.Electronic, InvoiceCount: 4, CustomerCount: 52, 65898),
Console.WriteLine("Invoices:");
foreach (var invoice in invoices)
Console.WriteLine(invoice);
var flattened = invoices.GroupBy(invoice => invoice.Country)
.Select(group => new CountryInvoice(group));
Console.WriteLine("Flattened Invoices:");
foreach (var invoice in flattened)
Console.WriteLine(invoice);
enum BillingMethod { None, Paper, Electronic }
record Invoice(string Country,
BillingMethod BillingMethod,
record CountryInvoice(string Country,
int ElectronicInvoiceCount,
int ElectronicCustomerCount,
decimal ElectronicAmount)
public CountryInvoice(IGrouping<string, Invoice> group)
: this(group.Key, 0, 0, 0, 0, 0, 0)
foreach(var invoice in group)
switch(invoice.BillingMethod)
case BillingMethod.Paper:
PaperInvoiceCount = invoice.InvoiceCount;
PaperCustomerCount = invoice.CustomerCount;
PaperAmount = invoice.Amount;
case BillingMethod.Electronic:
ElectronicInvoiceCount = invoice.InvoiceCount;
ElectronicCustomerCount = invoice.CustomerCount;
ElectronicAmount = invoice.Amount;