Установите размер логического массива в словаре - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь сделать что-то концептуально простое, но по какой-то причине не могу понять.

Я делаю древовидную структуру (или октре в этом случае):

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}", но я не хочу указывать их по одному за раз. Затем я попытался создать «класс Index: Boolean [1,1,1]», но вы не можете наследовать от запечатанного логического класса, и попытка ограничить его до [1,1,1], как это не будет работать, даже если вы мог. Затем я попытался создать псевдоним "using Index = System.Boolean [,,];" но это тоже не работает.

Я также хочу сделать "детей" только для чтения. Вы не должны быть в состоянии изменить используемый им словарь или ключи. Значения ключей вы можете установить только один раз, но вы не будете знать, что это такое, пока не будут созданы дочерние элементы. Я понятия не имею, возможно ли это вообще.

Любая помощь, которую вы можете мне оказать, приветствуется, спасибо.

1 Ответ

1 голос
/ 15 марта 2019

Сделайте ваш словарь приватным и измените тип ключа - с массива 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();
...