using System.Collections.Generic;
public static void Main()
var monsterBone = new Resource{Id = 1, Name = "Monster Bone", Kind = ResourceKind.Bone, };
var monsterHide = new Resource{Id = 2, Name = "Monster Hide", Kind = ResourceKind.Hide, };
var monsterOrgan = new Resource{Id = 3, Name = "Monster Organ", Kind = ResourceKind.Organ, };
var unicornFur = new Resource{Id = 4, Name = "Unicorn Fur", Kind = ResourceKind.Bone | ResourceKind.Hide, };
Resources = new Dictionary<ResourceKind, int>{{ResourceKind.Bone, 1}, {ResourceKind.Hide, 1}, },
UniqueResources = new Dictionary<Resource, int>{{unicornFur, 1}},
var inventory = new List<Resource>{unicornFur, unicornFur, };
if (inventory.CanCraft(recipe))
throw new InvalidOperationException();
var inventory = new List<Resource>{unicornFur, unicornFur, monsterBone };
if (!inventory.CanCraft(recipe))
throw new InvalidOperationException();
var inventory = new List<Resource>{unicornFur, unicornFur, monsterHide };
if (!inventory.CanCraft(recipe))
throw new InvalidOperationException();
Console.WriteLine("Everything is fine!");
public static class Extensions
public static bool CanCraft( this IEnumerable<Resource> inventory, IDictionary<Resource, int> uniqueResources, out IEnumerable<Resource> remainingInventory )
var inv = inventory.ToList();
remainingInventory = inv;
if (uniqueResources == null || !uniqueResources.Any())
foreach (var item in uniqueResources)
for (int i = 0; i < item.Value; i++)
if (!inv.Contains( item.Key ))
public static bool CanCraft( this IEnumerable<Resource> inventory, IDictionary<ResourceKind, int> resources )
var inv = inventory.ToList();
if (resources == null || !resources.Any())
var rk = resources.First().Key;
var res = resources.ToDictionary( e => e.Key, e => e.Value );
foreach (var item in inv.Where( e => (e.Kind & rk) == rk ).ToList())
public static bool CanCraft( this IEnumerable<Resource> inventory, Recipe recipe )
IEnumerable<Resource> remainingInventory;
return inventory.CanCraft( recipe.UniqueResources, out remainingInventory ) && remainingInventory.CanCraft( recipe.Resources );
public Dictionary<ResourceKind, int> Resources
public Dictionary<Resource, int> UniqueResources