c# - 设置字典中布尔数组的大小
问题描述
我正在尝试做一些概念上简单的事情,但由于某种原因我无法弄清楚。
我正在制作一个树结构(在这种情况下是八叉树):
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[,,];” 但这也不起作用。
我也想让“孩子”成为只读的。您应该无法更改它使用的字典或键。您应该只能设置一次键的值,但在创建子项之前您不会知道它们是什么。我不知道这是否可能。
感谢您给我的任何帮助,谢谢。
解决方案
将您的字典设为私有并更改键类型 - 从 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();
推荐阅读
- c# - 在 WPF ListView 中动态创建组
- angular - 角度路由器导航问题
- python - 如何使用相同的代码满足不同的字符串格式化场景?
- r - 如何从R中的字符串中提取特定数字
- sql - 需要在 oracle 中使用 group by 查询并计算以下内容
- c# - 请求的协议尚未配置到系统中,或者不存在它的实现
- windows - 排除某个其他文件中包含的键字符串文件的所有行
- haskell - 如何指定两个类型变量相同?
- android - 如果 Qt3DWindow 嵌入在 QWidget 中,为什么 Qt3D QObjectPicker 在 Android 上不起作用?
- list - 将地雷的相邻坐标存储在列表中