using System.Collections.Generic;
public int OptionID { get; set; }
public bool IsSelected { get; set; }
public int ProductID { get; set; }
public int Quantity { get; set; }
public List<Option> Options { get; set; }
public static void Main()
var products = PopulateProducts();
var query = products.GroupBy(p => p.ProductID, (key, values) => new
Quantity = values.Sum(v => v.Quantity),
.SelectMany(v => v.Options.Where(o => o.IsSelected))
.GroupBy(o => o.OptionID, (k, v) => new
Console.WriteLine(x.Quantity + "x Product" + x.ProductID);
foreach(var y in x.Options)
Console.WriteLine("\t" + y.Quantity + "x Option" + y.OptionID);
private static List<Product> PopulateProducts()
var products = new List<Product>();
products.Add(new Product() {
Options = new List<Option>() {
new Option() { OptionID = 1, IsSelected = false },
new Option() { OptionID = 1, IsSelected = true },
new Option() { OptionID = 2, IsSelected = false },
new Option() { OptionID = 2, IsSelected = true }
products.Add(new Product() {
Options = new List<Option>() {
new Option() { OptionID = 1, IsSelected = true },
new Option() { OptionID = 1, IsSelected = false },
new Option() { OptionID = 2, IsSelected = true },
new Option() { OptionID = 2, IsSelected = false }
private static void PrintProducts(List<Product> products)
foreach(var p in products)
Console.WriteLine(p.Quantity + "x Product" + p.ProductID);
foreach(var o in p.Options)
Console.WriteLine("\t OptionID " + o.OptionID);