C# 设置字典中布尔数组的大小

C# 设置字典中布尔数组的大小,c#,arrays,dictionary,tree,boolean,C#,Arrays,Dictionary,Tree,Boolean,我试图做一些概念上简单的事情,但由于某种原因我无法理解 我正在制作一个树结构(本例中为八叉树): 类八叉树 { 公共只读八叉树父树; 公共字典儿童; 公共只读bool[,]索引; } 布尔数组只能是[1,1,1],子字典只能包含8个键值对 我可以很好地得到这8个孩子,但我一辈子都搞不懂如何强制布尔数组只能是[1,1,1] 我环顾四周,找不到答案,这可能很简单,没人问过,但我在兜圈子 我尝试过创建一个“结构索引{boolx,y,z}”,但我不想一次指定一个。然后我尝试创建一个“类索引:Boole

我试图做一些概念上简单的事情,但由于某种原因我无法理解

我正在制作一个树结构(本例中为八叉树):

类八叉树 { 公共只读八叉树父树; 公共字典儿童; 公共只读bool[,]索引; } 布尔数组只能是[1,1,1],子字典只能包含8个键值对

我可以很好地得到这8个孩子,但我一辈子都搞不懂如何强制布尔数组只能是[1,1,1]

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

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

我还想让“儿童”成为只读的。您不应该更改它使用的词典或键。键的值只能设置一次,但在创建子项之前,您将不知道这些值是什么。我不知道这是否可能


非常感谢您提供的任何帮助。

将您的字典设置为私有,并将密钥类型从bool数组更改为int

private readonly Dictionary<int, Octree> children = new Dictionary<int, Octree>();
其中
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);
}

“我一辈子都搞不清楚如何将布尔数组强制为[1,1,1]”听起来你最好使用自定义数据结构?我不明白你想用一个接一个的数组做什么。这不只是一个
bool
值吗?还是我误解了你所说的
[1,1,1]
?你的问题是你无意中创建了一个三维数组,而你似乎想要一个由3
bool
s组成的一维数组。但要为您提供解决方案,我们需要更好地了解您的用法。您将
1
作为值,而不是使用
true
false
。您还将其称为一个永不改变的常数,这就是为什么您的字典只有一个键。你能更好地解释一下你的情况吗?我同意第一条评论。这个问题虽然让人困惑,但听起来很像a。要有8个坐标,你的声明应该是[2,2,2],正如其他人所指出的[1,1,1]只给出了我需要的1个元素,但只针对索引值,而不是子元素。我将尝试为它制作一个自定义索引器,为孩子们添加一个索引器将非常方便。谢谢公共结构索引{bool[]Index;public bool[]this[bool x,bool y,bool z]{get{return Index;}set{Index[0]=x;Index[1]=y;Index[2]=z;}}}}这是我一直在寻找的,使用索引作为键间接地限制了大小,所以现在应该可以使用了。
public Octree this[bool x, bool y, bool z]
{
    get => children[GetIndex(x, y, z)];
    set => children[GetIndex(x, y, z)] = value;
}
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);
}
var root = new Octree();
root[true, false, false] = new Octree();