如何遍历包含多个键的字典列表,并更改不同的键值?

时间:2018-07-05 23:55:42

标签: c# python dictionary

所以我曾经使用Python工作,最近我切换到了C#。我一直在尝试用C#重新创建我的Python项目之一,但我陷入了一些涉及字典的问题。在我的Python代码的一部分中,我创建了一些字典,每个字典有两个键,并将所有字典添加到列表中:

sM_Likes <- sparseMatrix(Likes, i=likes$userid, j=1,c(2:ncol(Likes)), x=1)

然后,稍后,我遍历字典列表,并能够轻松地更改slot0 = {"itemID": 0, "amount": 0} slot1 = {"itemID": 0, "amount": 0} slot2 = {"itemID": 0, "amount": 0} inv = [slot0, slot1, slot2] 键和itemID键的值:

amount

但是,在C#中,这似乎并不容易。我成功创建了字典并将它们添加到列表中:

 for slot in inv:
      if slot["item"] == 0:
           slot["item"] = 2
           slot["amount"] += 1
           break

但是我不确定如何从Python代码复制Dictionary<string, int> slot0 = new Dictionary<string, int>() { { "itemID", 0 }, { "amount", 0 } }; Dictionary<string, int> slot1 = new Dictionary<string, int>() { { "itemID", 0 }, { "amount", 0 } }; Dictionary<string, int> slot2 = new Dictionary<string, int>() { { "itemID", 0 }, { "amount", 0 } }; List<Dictionary<string, int>> inv = new List<Dictionary<string, int>>(); private void Start() { inv.Add(slot0); inv.Add(slot1); inv.Add(slot2); } 循环。我知道for是一件事情,我可以将它与KeyValuePairs一起使用,但是我很确定您不能使用它来更改多个键的值。如果有人可以帮助,那就太好了。对不起,如果我的问题不清楚。我很乐于澄清。

1 个答案:

答案 0 :(得分:3)

这可能不是最优雅的解决方案,但它与您在Python中拥有的匹配。您将foreach很好地跟随在Python的for之后的列表中。之后,您将得到slot字典,只需使用索引器和键即可访问和更改其值。

// I use `var` because I believe it to be more "csharponic" ;).
foreach (var slot in inv)
{
    if (slot["itemID"] == 0) {
        slot["itemID"] = 2;
        slot["amount"] += 1;
        break;
    }
}

您可能应该查看Dictionary docs,以了解访问字典的可能问题。在我的示例中,如果您使用的密钥不存在,您将得到一个KeyNotFoundException。为了使代码更健壮,请按照@Sach的建议在if中添加一个密钥检查;像这样:

if (slot.ContainsKey("itemID") && slot["itemID"] == 0) { ... }

为了完整性,您也可以使用TryGetValue

foreach (var slot in inv)
{
    var v = 0;
    if (slot.TryGetValue("itemID", out v) && v == 0)
    {
        slot["itemID"] = 2;
        slot["amount"] += 1;
        break;
     }
}

正如@mjwills在评论中指出的那样,这样做的好处是可以减少键查找的次数(有关out的更多信息,请参见this)。 Item[]ContainsKeyTryGetValue“接近O(1)。