C#双字典更改值

时间:2018-12-12 02:24:49

标签: c# dictionary

你好,我有以下字典,可以添加和读取它,但不能更改值。

    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);

例如,我知道如何更改以下值? 游戏玩家[0] dictionary2 [0] .Value.status = 1;

我希望我作为Stackoverflow的新手问清楚我的问题。感谢您的帮助。

[编辑]我知道我可以检查密钥是否存在,但是我尝试不可以更改密钥的存在

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

[EDIT2]除此之外,我如何快速检查第二个字典是否具有特定值

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

4 个答案:

答案 0 :(得分:2)

假设键存在,则可以通过其索引器(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

答案 1 :(得分:0)

您可以使用此:

foreach (var outer in gamesplayers)
{
    foreach (var inner in outer.Value)
    {
        if(inner.Key == "Something")
        {
            // do something
            inner.Value = “test”;
        }
    }
}

答案 2 :(得分:0)

您可以使用LINQ

{{1}}

答案 3 :(得分:0)

努力理解为什么您需要第二本Dictionary,因为已经能够对游戏进行计数了。您可能还想研究在类上使用具有唯一标识符的类列表,因为Dictionary本身很难理解它们的深层含义。但是,要解决您的问题,建议使用以下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
}

我相信这对您有用。但是字典令人困惑,因此可能需要一些改动(再次建议以唯一的可识别列表类为代价。如果需要,可以提供示例)