【问题标题】:Set the size of a boolean array inside a dictionary设置字典中布尔数组的大小
【发布时间】:2019-03-15 17:23:43
【问题描述】:

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

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

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

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

感谢您提供的任何帮助,谢谢。

【问题讨论】:

  • “我这辈子都不知道如何将布尔数组强制为 [1,1,1]” 听起来像你'使用自定义数据结构会更好吗?
  • 我不明白你想用一个一个一个的数组做什么。这不只是一个bool 值吗?还是我误解了[1,1,1] 的意思?
  • 您的问题是您无意中创建了一个三维数组,并且您似乎想要一个 3 bools 的一维数组。但要为您提供解决方案,我们需要更好地了解您的使用情况。不是使用truefalse,而是引用1 作为值。您还将它称为一个永不改变的常量,这导致了为什么您会有一个只有一个键的字典。你能更好地解释一下你的情况吗
  • 我同意第一条评论。这个问题虽然令人困惑,但听起来很像XY Problem
  • 要有 8 个坐标,你的声明应该是 [2,2,2],正如其他人指出的 [1,1,1] 只给出 1 个元素

标签: c# arrays dictionary tree boolean


【解决方案1】:

将您的字典设为私有并更改键类型 - 从 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();

【讨论】:

  • 我需要的东西,但只是为了索引值,而不是为了孩子。我将尝试为此制作一个自定义索引器,并为孩子们添加一个将很方便。谢谢!
  • 公共结构索引 { bool[] 索引; public bool[] this[bool x, bool y, bool z] { get { return index; } 设置 { 索引 [0] = x;索引[1] = y;索引[2] = z; } } } 这正是我一直在寻找的,使用 Index 作为键间接限制了大小,所以它现在应该可以工作了。
猜你喜欢
  • 2018-02-24
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2010-11-20
  • 2016-04-02
  • 1970-01-01
  • 2017-10-10
相关资源
最近更新 更多