Как перебрать список словарей, которые содержат более одного ключа, и изменить различные значения ключа?

1

Поэтому я работал в 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, но я уверен, что вы не можете изменить значения нескольких ключей. Если бы кто-нибудь мог помочь, это было бы здорово. Извините, если мой вопрос не слишком ясен; Я был бы более чем счастлив прояснить.

Теги:
dictionary

1 ответ

3
Лучший ответ

Это может быть не самое элегантное решение, но оно соответствует тому, что у вас есть на 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).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню