using System.Collections.Generic;
public static void Main()
var discounts = CalculateDiscounts(articles, 3, 2);
DisplayDiscounts(discounts, 3, 2);
discounts = CalculateDiscounts(articles, 3, 1);
DisplayDiscounts(discounts, 3, 1);
static IEnumerable<Discount> CalculateDiscounts(IEnumerable<Article> items, int minPurchaseQuantity, int payFor)
var batchedItems = BatchItemsEligibleForDiscount(items, minPurchaseQuantity);
return batchedItems.Select(batch => batch.Skip(payFor))
.SelectMany(batch => batch)
.Select(article => new Discount() { Value = article.UnitPrice });;
static IEnumerable<IEnumerable<Article>> BatchItemsEligibleForDiscount(IEnumerable<Article> items, int minPurchaseQuantity)
return items.OrderByDescending(article => article.UnitPrice)
.Select(article => Enumerable.Range(1, article.Quantity).Select(n => new Article() { Quantity = 1, UnitPrice = article.UnitPrice }))
.SelectMany(item => item)
.Select((article, index) => new { article, index })
.GroupBy(x => x.index / minPurchaseQuantity)
.Where(group => group.Count() == 3)
.Select(group => group.Select(x => x.article));
static void DisplayDiscounts(IEnumerable<Discount> discounts, int minPurchaseQuantity, int payFor)
Console.WriteLine("Take " + minPurchaseQuantity + " pay for " + payFor);
foreach(var discount in discounts)
Console.WriteLine(discount.Value);
public double UnitPrice { get; set; }
public int Quantity { get; set; }
public double Value { get; set; }