所以我曾经使用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一起使用,但是我很确定您不能使用它来更改多个键的值。如果有人可以帮助,那就太好了。对不起,如果我的问题不清楚。我很乐于澄清。
答案 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[]
,ContainsKey
和TryGetValue
“接近O(1)。