你好,我有以下字典,可以添加和读取它,但不能更改值。
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)
{
}
}
答案 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
}
我相信这对您有用。但是字典令人困惑,因此可能需要一些改动(再次建议以唯一的可识别列表类为代价。如果需要,可以提供示例)