Add exercise 3 (Buyers, C#): the pure extract-lambda rep

New in-theme classes: Buyers computes a shopping-list total, PriceList
stands for the pricing service (random surge, flaky test). One loop, one
lambda-able expression — the third example teaches the move with nothing
else in the way. Pristine repo + reference solution (extract lambda,
slide, extract method with Func<IceCream,int> parameter, pure-lambda
test) + storyboard in the established style. Mirrors the kata's C#
setup (net7.0, MSTest); needs a build check on a machine with the SDK.
This commit is contained in:
Your Name
2026-09-28 21:48:30 +00:00
parent 558ad54516
commit 1189041d8e
22 changed files with 658 additions and 0 deletions
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
namespace IceCreamBuyers
{
public class Buyer
{
public Buyer(string name, IReadOnlyList<IceCream> favourites)
{
Name = name;
Favourites = favourites;
}
public string Name { get; }
public IReadOnlyList<IceCream> Favourites { get; }
public int ScoopsOf(IceCream flavour)
{
return 2;
}
}
}
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
namespace IceCreamBuyers
{
public class Buyers
{
private readonly PriceList priceList = new();
private readonly List<Buyer> buyers = new()
{
new("Anke", new List<IceCream> { IceCream.Strawberry, IceCream.Vanilla }),
new("Bram", new List<IceCream> { IceCream.Chocolate }),
new("Celine", new List<IceCream> { IceCream.Vanilla, IceCream.Chocolate }),
};
public int ShoppingListTotal(string buyerName)
{
var buyer = ByName(buyerName);
var total = 0;
foreach (var flavour in buyer.Favourites)
{
total += buyer.ScoopsOf(flavour) * priceList.PriceFor(flavour);
}
return total;
}
private Buyer ByName(string name)
{
return buyers.Find(b => b.Name == name)
?? throw new InvalidOperationException($"Unknown buyer {name}.");
}
}
}
@@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
</PropertyGroup>
</Project>
@@ -0,0 +1,9 @@
namespace IceCreamBuyers
{
public enum IceCream
{
Strawberry,
Chocolate,
Vanilla
}
}
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
namespace IceCreamBuyers
{
public class PriceList
{
// placeholder implementation - real version would call the pricing service
private static readonly Dictionary<IceCream, int> BasePrices =
new()
{
{ IceCream.Strawberry, 3 },
{ IceCream.Vanilla, 2 },
{ IceCream.Chocolate, 4 },
};
public int PriceFor(IceCream flavour)
{
return BasePrices[flavour] + SurgePricing();
}
private int SurgePricing()
{
return new Random().Next(3);
}
}
}