首页 > 解决方案 > 设置字典中布尔数组的大小

问题描述

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

我正在制作一个树结构(在这种情况下是八叉树):

class Octree
{
    public readonly Octree parent;
    public Dictionary<Boolean[,,], Octree> children;
    public readonly bool[,,] index;
}

布尔数组只能是 [1,1,1] 并且子字典只能包含 8 个键值对。

我可以让 8 个孩子过得很好,但我一生都无法弄清楚如何将布尔数组强制为 [1,1,1]

我环顾四周,找不到答案,这可能很简单,没有人问过,但我在兜圈子。

我试过制作一个“struct Index {bool x,y,z}”,但我不想一次指定一个。然后我尝试创建一个“类索引:布尔 [1,1,1]”,但您不能从密封的布尔类继承,并尝试将其限制为 [1,1,1],即使您可以。然后我尝试创建一个别名“使用 Index = System.Boolean[,,];” 但这也不起作用。

我也想让“孩子”成为只读的。您应该无法更改它使用的字典或键。您应该只能设置一次键的值,但在创建子项之前您不会知道它们是什么。我不知道这是否可能。

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

标签: c#arraysdictionarytreeboolean

解决方案


将您的字典设为私有并更改键类型 - 从 bool 数组到 int

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

推荐阅读