Поэтому я работал в Python, и недавно я перешел на С#. Я пытался воссоздать один из моих проектов Python на С#, и я немного застрял в словарях. В части моего кода Python я создал несколько словарей с двумя ключами каждый и добавил все словари в список:
slot0 = {"itemID": 0, "amount": 0}
slot1 = {"itemID": 0, "amount": 0}
slot2 = {"itemID": 0, "amount": 0}
inv = [slot0, slot1, slot2]
Затем, позже, я зациклился на списке словарей и смог легко изменить значения как ключа itemID
ключа amount
:
for slot in inv:
if slot["item"] == 0:
slot["item"] = 2
slot["amount"] += 1
break
Однако в С# это не так просто. Я успешно создал словари и добавил их в список:
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
из кода Python. Я знаю, что foreach
- это вещь, и я могу использовать ее с KeyValuePairs, но я уверен, что вы не можете изменить значения нескольких ключей. Если бы кто-нибудь мог помочь, это было бы здорово. Извините, если мой вопрос не слишком ясен; Я был бы более чем счастлив прояснить.
Это может быть не самое элегантное решение, но оно соответствует тому, что у вас есть на Python. Вы будете foreach
-ing над списком, который следует for
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, чтобы узнать о возможных проблемах с доступом к словарям. В моем примере, если ключ, который вы используете, не существует, вы KeyNotFoundException
. Чтобы сделать код более надежным, добавьте ключ проверки в if
как предложено @Sach; вот так:
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
см это). Item[]
, ContainsKey
и TryGetValue
"приближаются к O (1).