迭代字典并移除/添加游戏循环中的键

本文关键字:循环 游戏 添加 字典 迭代 | 更新日期: 2023-09-27 18:21:06

我正在创建一个控制台应用程序游戏。游戏包含Point对象(xy属性)和其他类继承的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();
}