我正在尝试做一些概念上简单的事情,但是由于某种原因我无法弄清楚。
我正在制作树形结构(在这种情况下为八叉树):
class Octree
{
public readonly Octree parent;
public Dictionary<Boolean[,,], Octree> children;
public readonly bool[,,] index;
}
布尔数组只能为[1,1,1],子字典必须仅包含8个键值对。
我可以抚养8个孩子,但我一生都无法弄清楚如何将布尔数组强制为[1,1,1]
我环顾四周,找不到答案,这可能很简单,没人问过,但是我正在圈子里奔跑。
我尝试制作“结构索引{bool x,y,z}”,但我不想一次指定一个。然后,我尝试制作一个“类索引:Boolean [1,1,1]”,但是您不能从密封的布尔类继承,并尝试将其限制为[1,1,1],即使您可以。然后,我尝试使用“使用Index = System.Boolean [,,];”作为别名。但这也不起作用。
我也想使“孩子”有点只读。您不应该更改它使用的字典或键。键的值只能设置一次,但是在创建子项之前,您将不知道它们的含义。我不知道那是否有可能。
感谢您能给我的任何帮助。
答案 0 :(得分:1)
将您的词典设为私有并更改键类型-从布尔数组更改为整数
private readonly Dictionary<int, Octree> children = new Dictionary<int, Octree>();
现在添加自定义索引器:
public Octree this[bool x, bool y, bool z]
{
get => children[GetIndex(x, y, z)];
set => children[GetIndex(x, y, z)] = value;
}
GetIndex
如下所示:
private int GetIndex(bool x, bool y, bool z)
{
Func<bool, int> toInt = b => b ? 1 : 0;
return toInt(x) << 2
| toInt(y) << 1
| toInt(z);
}
现在您可以像使用Octree
var root = new Octree();
root[true, false, false] = new Octree();