using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
private static readonly Dictionary<int, string> _combinations = new Dictionary<int, string>() { { 3, "Fizz" }, { 5, "Buzz" } };
public static void Main()
var strategy = new FizzBuzzStrategy(_combinations);
var printer = new FizzBuzzPrinter();
CalculateFizzBuzz(strategy, printer);
private static void CalculateFizzBuzz(IFizzBuzzStrategy strategy, IFizzBuzzPrinter printer)
strategy.Calculate(100, printer);
private interface IFizzBuzzStrategy
void Calculate(int num, IFizzBuzzPrinter printer);
private interface IFizzBuzzPrinter
void Print(int num, string[] fizzBuzz);
private class FizzBuzzStrategy : IFizzBuzzStrategy
public readonly IDictionary<int, string> Combinations;
public FizzBuzzStrategy(IDictionary<int, string> combinations)
Combinations = combinations;
public void Calculate(int num, IFizzBuzzPrinter printer)
foreach (var i in Enumerable.Range(1, num))
var hits = Combinations.Where(x => i % x.Key == 0).Select(x => x.Value);
printer.Print(i, hits.ToArray());
private class FizzBuzzPrinter : IFizzBuzzPrinter
private string GetFizzBuzz(int num, string[] fizzBuzz)
return fizzBuzz.Any() ? string.Join(string.Empty, fizzBuzz) : num.ToString();
public void Print(int num, string[] fizzBuzz)
Console.WriteLine("{0}", GetFizzBuzz(num, fizzBuzz));