C # Двойное значение словаря - PullRequest
0 голосов
/ 12 декабря 2018

Здравствуйте, у меня есть следующий словарь, и я могу добавлять и читать из него, но не изменять его значение.

    class GamesPlayersClass
    {
        public string nickname { get; set; }
        public int status { get; set; } //0 not ready 1 ready 2 finished
        public int dies { get; set; }
        public int score { get; set; }
        public int totaltime { get; set; }
    }

    static Dictionary<int, Dictionary<int, GamesPlayersClass>> gamesplayers = new Dictionary<int, Dictionary<int, GamesPlayersClass>>();

Добавление записи в словарь:

       Dictionary<int, GamesPlayersClass> playerinfo = new Dictionary<int, GamesPlayersClass>();
       playerinfo.Add(games.Count,
       new GamesPlayersClass
       {
                        nickname = nickName,
                        status = 0,
                        dies = 0,
                        score = 0,
                        totaltime = 0
        });
        gamesplayers.Add(games.Count, playerinfo);

Любая идея, какЯ мог бы, например, изменить следующее значение?gamesplayers [0] dictionary2 [0] .Value.status = 1;

Надеюсь, я четко задал свой вопрос, поскольку я новичок в Stackoverflow.Спасибо за помощь.

[ПРАВИТЬ] Я знаю, что могу проверить, существует ли ключ, но не как поменять его на существующий ключ, я пытаюсь

if (gamesplayers[0].ContainsKey(0));

[ПРАВИТЬ2].Я могу быстро проверить, имеет ли второй диктонар определенное значение

foreach (var game in gamesplayers )
{
foreach (var playerinfo in game)
{
  if (playerinfo.Value.nickname == nickName)
{
}
}

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Изо всех сил пытаясь понять, зачем вам второй словарь, из-за возможности просто подсчитать счет в игре.Вы также можете захотеть изучить использование списков класса с уникальным идентификатором класса, так как словарь по своей сути труден для понимания, чем глубже они получают.Однако, чтобы решить вашу проблему, рекомендую использовать linq, как показано ниже

gameplayers.Where(gp => gp.Key == "insertExpectedIntHere" && 
                    gp.Any(p => p.Key == "insertExpectedIntHere" && p.nickname == "nicknameHere");

if (gameplayers != null)
{
    Do the thing
}
else
{
    Do the other thing
}

Я думаю, что это сработает для вас.Но словари сбивают с толку, поэтому может потребоваться немного передвинуться (снова рекомендую обменять на уникальные идентифицируемые списки классов. При необходимости приведу пример)

0 голосов
/ 12 декабря 2018

Вы можете использовать это:

foreach (var outer in gamesplayers)
{
    foreach (var inner in outer.Value)
    {
        if(inner.Key == "Something")
        {
            // do something
            inner.Value = “test”;
        }
    }
}
0 голосов
/ 12 декабря 2018

Вы можете использовать LINQ

var gKey = 1;
var pKey = 1;
var game = (from g in gamesplayers where g.key == gKey).FirstOrDefault();
var playerinfo = (from p in game where p.key == pKey).FirstOrDefault();
playerinfo[pKey].Value.status =  "status";
0 голосов
/ 12 декабря 2018

Предполагая, что ключи существуют, вы можете получить доступ к значению словаря по его индексатору (Dictionary[key] нотация).Поскольку у вас есть вложенный словарь, вы можете вызвать оба индексатора

gamesplayers[0][0].status = 1;

Примечание 1 : это не потокобезопасно

Примечание 2: вам, вероятно, следует использовать TryGetValue и добавить соответствующую отказоустойчивость

Обновить

Ваш отредактированный код в порядке, просто используйтеContains, однако вы найдете TryGetValue более удобным в большинстве ситуаций.Если вы хотите получить фантазию, вы можете написать свой собственный метод расширения

public static class Extensions
{
   // checks if both keys exists and returns true or false
   // returns a result if valid
   public static bool TryGetValue<TKey1, TKey2, TValue>(this Dictionary<TKey1, Dictionary<TKey2, TValue>> dict, TKey1 key1, TKey2 key2, out TValue result)
   {
      if(dict == null)
         throw new ArgumentNullException(nameof(dict));

      result = default;

      return dict.TryGetValue(key1, out var nestedDict) && nestedDict.TryGetValue(key2, out result);
   }
}

Использование

If(gamesplayers.TryGetValue(key1, key2, out var result))
  Debug.WriteLine($"yay we checked and returned a result {result.nickname}");

Примечание 3 : это только для академических целей и не может быть лучшим решением для того, что вы действительно хотите.Однако он показывает, как использовать TryGetValue

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