0

我正在创建一个控制台应用程序游戏。游戏包含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只有查字典才能知道它的 位置。请不要告诉我添加此属性,因为我不能而且那不是目标。
4

2 回答 2

1

如果您需要坚持使用字典,解决问题的最简单方法是在迭代时使用临时字典,这样您就可以实际删除/添加键。

正如我从您的 foreach 循环中了解到的那样,每个 GameObject 都会移动,因此您可以迭代您的 Dictionary 并使用新值从头开始构建一个新的。

于 2013-07-03T17:48:49.377 回答
0

除了可疑的设计实践,这可能会解决您的并发修改问题:

foreach (GameObject obj in myDict.SelectMany(pair=>pair.Value).ToList())
{
    obj.move();
}
于 2013-07-03T18:22:56.727 回答