using System.Collections.Generic;
private Switch<int, Action> _simpleSwitch;
private Switch<int, Action> _complexSwitch;
Console.WriteLine("**** Simple Cases");
Console.WriteLine("\n\n**** Complex Cases");
private void TestSimpleCases()
_simpleSwitch = new Switch<int, Action>(GetSimpleCases(), () => Console.WriteLine("Does not equal 3, 30, or 300"));
PrintSimpleGetValue(300);
PrintSimpleGetValue(301);
PrintSimpleGetValue(500);
Console.WriteLine("Inserting 500 as case");
_simpleSwitch.AddCase(500, () => Console.WriteLine("Equals 500"));
_simpleSwitch.UpdateDefault(() => Console.WriteLine("Does not equal 3, 30, 300, or 500"));
PrintSimpleGetValue(500);
private void TestComplexCases()
_complexSwitch = new Switch<int, Action>(GetComplexCases(), () => Console.WriteLine("Number not in any case range"));
PrintComplexGetValue(30);
PrintComplexGetValue(300);
PrintComplexGetValue(301);
PrintComplexGetValue(500);
Console.WriteLine("Inserting >=500 as case");
_complexSwitch.AddCase(x => x >= 500, () => Console.WriteLine("Greater than or equal to 500"));
PrintComplexGetValue(500);
private void PrintSimpleGetValue(int number)
Console.Write(number + ": ");
_simpleSwitch.GetValue(number)();
private void PrintComplexGetValue(int number)
Console.Write(number + ": ");
_complexSwitch.GetValue(number)();
private Dictionary<int, Action> GetSimpleCases()
return new Dictionary<int, Action>
{ 3, () => Console.WriteLine("Equals 3") },
{ 30, () => Console.WriteLine("Equals 30") },
{ 300, () => Console.WriteLine("Equals 300") }
private Dictionary<Predicate<int>, Action> GetComplexCases()
return new Dictionary<Predicate<int>, Action>
{ x => x <= 3, () => Console.WriteLine("Smaller than or equal to 3") },
{ x => x <= 30, () => Console.WriteLine("Smaller than or equal to 30") },
{ x => x <= 300, () => Console.WriteLine("Smaller than or equal to 300") }
public class Switch<TKey, TValue>
readonly Dictionary<Predicate<TKey>, TValue> Cases;
public Switch(TValue @default)
this.Cases = new Dictionary<Predicate<TKey>, TValue>();
public Switch(Dictionary<TKey, TValue> cases, TValue @default) : this(@default)
cases.ToList().ForEach(kvp => AddCase(kvp.Key, kvp.Value));
public Switch(Dictionary<Predicate<TKey>, TValue> cases, TValue @default) : this(@default)
cases.ToList().ForEach(kvp => AddCase(kvp.Key, kvp.Value));
public TValue GetValue(TKey @case)
var caseValue = Cases.FirstOrDefault(kvp => kvp.Key(@case));
if (!caseValue.Equals(default(KeyValuePair<Predicate<TKey>, TValue>)))
public void AddCase(TKey @case, TValue value)
AddCase(t => t.Equals(@case), value);
public void AddCase(Predicate<TKey> @case, TValue value)
public void UpdateDefault(TValue @default)