是否有一种类型的集合或关联数组,其中键也是和/或值的一部分?

时间:2014-06-10 04:38:11

标签: c# collections associative-array

我在地图上为Roguelike工作,地图的每个单元格都通过字典 [1] 访问,其中键是自定义结构Axis3 ,它只存储3轴上的整数位置。问题是,单元本身也需要跟踪其位置,这会导致数据重复。在这个特定的例子中,它不是很多额外的内存(3 MB用于活动区域,~60 MB用于保存在内存中但当前未计算的地图区域,但它暴露了一个问题如果可能的话,我认为应该解决这个问题(特别是因为细胞不是根据它们的位置在集合中自我关键的唯一对象)。

我在工作,因此到目前为止已经看过.NET 3.5中直接可用的选项以及与此类兼容的外部实现,但是找不到收藏的任何好运密钥是其中的一部分或是值。 HashSet实际上可以完美地满足我的需求(简单地使Axis3Cell具有相同的位置等于相等),但是没有迭代集合就无法检索原始引用

我也查看了KeyedCollection,但它似乎没有引用值内部的键,而是从值中复制键并将其插入单独的集合中进行查找目的,这会使KeyedCollection实际上更糟糕的内存占用。

[1]对于好奇,这是完成而不是数组,因为不是每个z级别甚至每个z级别的每个z级别(地形,项目,敌人等)都被填充,因此使用字典只要将丢失的单元格视为默认值(与稀疏数组的方式非常相似),即使仍然具有快速访问权限,也可以实现更小的内存占用。它还有其他好处,不值得进入这里。

1 个答案:

答案 0 :(得分:0)

简单的答案是否定的,我不知道任何合适的东西(尽管我主要使用Java而不是C#)。

问题是,为了将密钥存储到值中,您需要有一个位置来将密钥存储在值中。这意味着添加到集合中的对象需要具有适当的存储空间,或者您需要创建一个"包装器"具有该存储的对象,并且映射中的值将成为包装器对象。

您可以创建一个集合来为您提供所需的行为,但通过使对象的体系结构正确来更好地处理此问题。

将坐标作为不可变对象。然后地图成为对象坐标的地图。该对象还存储对坐标的引用。

移动对象的代码应该存在于一个地方,它应该更新对象中的引用并将地图中的对象作为一步移动。您可能还需要考虑线程同步以及安全性。

是的,不幸的是,这是重复的数据,但有时这是不可避免的。您希望能够在两个方向上都遵循链接,为了有效地执行此操作,您需要在两个方向上存在链接。

这里的关键是让某人无意中更改其中一个链接而不改变另一个链接。