Как узнать, находится ли данный узел в корне - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть тест, который я собираюсь делать довольно часто, поэтому, естественно, я хотел поместить его в метод.

В моем дереве у меня есть две кнопки, левая и правая, которые работают для перемещенияузел вверх на один уровень (уровень? не уверен в правильности используемого слова) или вниз на один уровень.

Тем не менее, некоторые элементы в моем древовидном представлении могут быть размещены только как дочерние элементы других определенных элементов.Некоторые элементы могут быть размещены как дочерние элементы ИЛИ как корневые узлы.

Итак, я создаю метод, в котором я передаю дочерний узел и родительский узел.Дочерний узел - это узел, который станет дочерним по отношению к родительскому узлу, если перемещение прошло успешно.Если щелкнуть левой кнопкой мыши, это означает, что родительский узел на самом деле является родителем текущего родительского узла.Если щелкнуть правой кнопкой мыши, это означает, что родительский узел в настоящее время является дочерним узлом дочернего узла и станет его родительским.

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

Я использую свои теги для хранения целых объектов, но я дал своим узлам дерева свои собственные изображения в imageindex, и я использую этоimageindex, чтобы определить, с каким типом узла я имею дело.Таким образом, прямо сейчас у меня есть:

private bool TestNodeMovement(TreeNode child, TreeNode parent)
{
  bool returnValue = false;
  switch(child.ImageIndex)
  {
    case 0:
    case 1:
      if ((parent.ImageIndex == 2 && parent.ImageIndex == 4) {
        returnValue = true;
      }
      break;
    case 2:
    case 4:
      if ((parent.ImageIndex == 0 && parent.ImageIndex == 1) {
        returnValue = true;
      }
      break;
    default: //all other tree movement types are accepted
      returnValue = true;
      break;
  }
  return returnValue;
}

Это самое первое - 0 & 1 - эти значения также могут быть в корне ... поэтому мне нужно проверить там, чтобы увидеть, является ли родительский объект корневым объектом.

Я думаю, я мог бы сделать

if (parent.Parent != null) { }

есть ли лучший способ?

1 Ответ

0 голосов
/ 05 апреля 2019

Когда вы находитесь внутри дерева, единственный реальный способ определить, находитесь ли вы в корне, - убедиться, что родитель не указан. Итак, если вы уже отслеживаете родительский узел, на котором находитесь, ваш оператор if, на который вы ссылались, является наилучшим способом. Для этого метода вы могли бы даже написать рекурсивный метод обхода, чтобы пройти вверх по дереву, пока не найдете корневой узел, если вы тоже захотите это сделать. Простая проверка нуля, безусловно, самый эффективный способ сделать это.

Если у вас нет родительского отслеживания в вашем дереве, и вы не хотите его указывать (или не можете, если вы используете внешнюю реализацию дерева), я бы предложил другой способ, в котором вы передаете корень и сделайте быструю проверку в вашем методе, спрашивая, совпадает ли узел с переданным в корневом узле.

...