设置字典内布尔数组的大小

时间:2019-03-15 17:23:43

标签: c# arrays dictionary tree boolean

我正在尝试做一些概念上简单的事情,但是由于某种原因我无法弄清楚。

我正在制作树形结构(在这种情况下为八叉树):

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 [,,];”作为别名。但这也不起作用。

我也想使“孩子”有点只读。您不应该更改它使用的字典或键。键的值只能设置一次,但是在创建子项之前,您将不知道它们的含义。我不知道那是否有可能。

感谢您能给我的任何帮助。

1 个答案:

答案 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();