using System; using System.Collections.Generic; using System.Linq; using System.Text; public class Test { public static void Main() { var researchTin = new Research { Name = "Tin" }; var researchFire = new Research { Name = "Fire" }; var researchWater = new Research { Name = "Water" }; var researchIron = new Research { Name = "Iron" }; var researchSteam = new Research { Name = "Steam" }; Dictionary> requiredResearches = new Dictionary>(); var req = new Research[] { researchTin }; requiredResearches.Add(researchIron, req.ToList()); req = new Research[] { researchFire, researchWater, researchIron }; requiredResearches.Add(researchSteam, req.ToList()); var playerResearches = new List(); playerResearches.Add(researchFire); //playerResearches.Add(researchWater); //playerResearches.Add(researchTin); var chain = GetReq(requiredResearches, researchSteam); var missing = chain.Where (c => playerResearches.Where (r => r == c).Any () == false).Distinct(); foreach(var miss in missing) { Console.WriteLine(miss.Name); } } public static IList GetReq(Dictionary> reqs, Research target) { var chain = new List(); if(reqs.ContainsKey(target)) { foreach(var item in reqs[target]) { chain.Add(item); chain.AddRange(GetReq(reqs, item)); } } return chain; } } public class Element { } public class Research { public string Name { get; set; } }