Как просмотреть список словарей, содержащих более одного ключа, и изменить значения различных ключей? - PullRequest
0 голосов
/ 06 июля 2018

Итак, я работал на Python и недавно переключился на C #. Я пытался воссоздать один из моих проектов на Python в C #, и я немного застрял в словарях. В части кода 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

Однако в C # это не так просто. Я успешно создал словари и добавил их в список:

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

1 Ответ

0 голосов
/ 06 июля 2018

Возможно, это не самое элегантное решение, но оно совпадает с тем, что есть в 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 , чтобы узнать о возможных проблемах с доступом к словарям. В моем примере, если ключ, который вы используете, не существует, вы получите 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 см. this ). Item[], ContainsKey и TryGetValue "подход O (1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...