Я думаю, что этот блок кода, по сути, пытается выполнить, связывая рецепты с ингредиентами внутри этого рецепта. Один из подходов состоит в том, чтобы включить список ингредиентов в сам класс рецепта, а затем сравнить его со списком переданных ингредиентов, например:
public interface IRecipe {
IEnumerable<Ingredient> Ingredients { get; }
}
public class Omlette : IRecipe {
public IEnumerable<Ingredient> Ingredients {
get {
return new Ingredient[]{new Ingredient("Salt"), new Ingredient("Egg")};
}
}
}
// etc. for your other classes.
IRecipie FindRecipiesYouCanMake(IEnumerable<Ingredientes> stuff, Cook cook)
{
var query = Recipes.Where(r => !r.Ingredients.Except(stuff).Any());
return query.First();
}
Предполагается, что у вас есть коллекция всех ваших рецептов. Это должно быть достаточно просто, чтобы настроить статический список или получить из базы данных.
Запрос Linq ищет любые рецепты, в которых все ингредиенты, переданные в материале, присутствуют в списке ингредиентов (или, как указано, в ингредиентах нет ингредиентов, которых нет в материале). Это также может уменьшить необходимость иметь подклассы для рецептов, что кажется немного странным (хотя, насколько я знаю, есть и другие причины, по которым вам это понадобится)