如何检查分配给Dictionary上的键的值是否都包含在列表中

时间:2017-10-24 21:01:23

标签: c# list dictionary

我只是放在这里的所有东西,你们可以看到,看看你能做什么:

private static List<Item> Inventory = new List<Item> ();


public static readonly Dictionary<string, RecipeComponent[]> recipes = new Dictionary<string, RecipeComponent[]>
{
    { "Bear Trap", new[] { new RecipeComponent("Metal Sheet", 1), new RecipeComponent("Duct Tape", 1), new RecipeComponent("Nails", 1) } },
    { "Metal Sheet", new[] { new RecipeComponent("Metal Fragments", 2) } }
};

public void Craft(string result) {
    if (HasItem (recipes [result].GetValue ())) {
        AddNew (result, 1);
    }
}

这是食谱字典的声明,其键是结果对象,第二部分是配方组件,正在定义库存,你可以看到我已经尝试过但未能制作Crafting方法

   public struct RecipeComponent
{
    public readonly string Material;
    public readonly int Count;

    public RecipeComponent(string material, int count)
    {
    Material = material;
    Count = count;
    }
}

这是recipecomponent对象的声明(无关紧要但仍然存在)

我需要知道的是如何找到与该密钥相关联的值,然后从那里查看清单列表是否具有密钥提及的所有值。

2 个答案:

答案 0 :(得分:0)

使用Linq方法GroupBy,您可以轻松组合所有项目并总结其计数。然后,您可以使用方法All来测试玩家是否具有所有项目所需的计数。

|  UNITCOST |
|-----------|
|  £1234.57 |
| £98765.00 |
| £34567.89 |
|     £0.00 |

答案 1 :(得分:0)

如果我理解正确,你基本上想要一种传递字符串的方法(这是_recipes字典中的一个键)。如果配方存在,那么您希望增加材料的数量。

假设您的_食谱如下

    static readonly Dictionary<string, List<RecipeComponent>> _recipes = new Dictionary<string, List<RecipeComponent>>
    {
        {
            "Bear Trap",
            new List<RecipeComponent>
            {
                new RecipeComponent("Metal Sheet", 1), new RecipeComponent("Duct Tape", 1),
                new RecipeComponent("Nails", 1)
            }
        },
        {"Metal Sheet", new List<RecipeComponent> {new RecipeComponent("Metal Fragments", 2)}}
    };

然后您可以按如下方式获取组件:

static List<RecipeComponent> GetComponents(string key)
    {
        return _recipes.FirstOrDefault(kv => kv.Key == key).Value;
    }

要添加recipeComponent,您需要配方键和新材料+计数。

    static void AddNewComponentTo(string recipeKey)
    {
        var component = _recipes.FirstOrDefault(kv => kv.Key == recipeKey);
        if (component.Value != null)
        {
            //If you are adding a new material
            component.Value.Add(new RecipeComponent("new material", 1));
        }
    }

要增加计数,您需要配方键和要更新的材料的名称。您可能希望将类更改为

public class RecipeComponent
{
    public  string Material { get; set; }
    public  int Count { get; set; }

    public RecipeComponent(string material, int count)
    {
        Material = material;
        Count = count;
    }
}

然后

 static void UpdateCount(string recipeKey, string mName, int updateCount)
    {
        var recipe = _recipes.FirstOrDefault(kv => kv.Key == recipeKey);
        if (recipe.Value != null)
        {
            var material = recipe.Value.FirstOrDefault(m => m.Material == mName);
            if (material != null)
            {
                material.Count += updateCount;
            }
        }
    }

注意:我将RecipeComponent []更改为List,以便您灵活地添加和删除字典

我希望这会有所帮助