迭代字典并移除/添加游戏循环中的键
本文关键字:循环 游戏 添加 字典 迭代 | 更新日期: 2023-09-27 18:21:06
我正在创建一个控制台应用程序游戏。游戏包含Point
对象(x
和y
属性)和其他类继承的GameObject
。
我创建了一个字典:
Dictionary<Point, List<GameObject>> myDict
字典中的每个点都存储一个或多个对象的列表。我不想空分。初始化字典的示例:
1. <(0,0), List<obj1>>
2. <(35,10), List<obj2, obj3>>
3. <(8,9), List<obj4, obj5>>
4. <(40,3), List<obj6>>
如果obj1
移动到(0,1):
<(0,1), List<obj1>>
<(35,10), List<obj2, obj3>>
<(8,9), List<obj4, obj5>>
<(40,3), List<obj6>>
正如您所看到的,具有key
(0,0)的对已被移除,并且(0,1)已被添加。
如果obj2
移动到(8,9):
<(0,1), List<obj1>>
<(35,10), List<obj3>>
<(8,9), List<obj4, obj5, obj2>>
<(40,3), List<obj6>>
在这种情况下,obj2
刚刚从列表中删除,密钥没有被删除,因为它存储obj3
,并且它不是空的。obj3
被添加到(8,9)列表中。
这些操作将在游戏循环内每250毫秒自动完成一次。我试着使用foreach loop
,类似于
foreach (KeyValuePair<Point, List<GameObject>> kvp in myDict)
{
foreach (GameObject obj in kvp.Value) {
obj.move();
}
}
但它不起作用,因为据我所知,在迭代时无法添加/删除键。
你有什么建议吗?
一些重要的事情:
- 我必须用字典才能做到这一点
GameObject
没有Point
属性。你可以知道在哪里只有当你查字典时才能找到GameObject
。请不要告诉我添加此属性,因为我不能,而这不是目标
如果您需要使用字典,解决问题的最简单方法是在迭代时使用临时字典,这样您就可以实际删除/添加键。
正如我从foreach循环中了解到的,每个GameObject都会移动,所以你可以迭代你的Dictionary,用新的值从头开始构建一个新的Dictionary。
撇开有问题的设计实践不谈,这可能会解决并发修改问题:
foreach (GameObject obj in myDict.SelectMany(pair=>pair.Value).ToList())
{
obj.move();
}