Как пометить целую ветвь древовидной структуры, измененную при изменении какого-либо элемента на ветке? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть древовидная структура, и я хотел бы иметь возможность отмечать (например, цветом) узлы, начиная с модифицированного узла и заканчивая корнем. Родительские узлы должны быть помечены как измененные, если любой из дочерних узлов помечен как измененный. Когда дочерний узел возвращается в неизмененное состояние, родительский элемент должен обновляться на основе состояния этого узла и состояния других дочерних узлов.

Я пытался:

  • Проверка состояния всех детей при изменении состояния одного ребенка и уведомление родителя. Это неэффективно, но не занимает память.
  • Ведение подсчета измененных детей в «родителях» и его обновление, что позволило мне избежать проверки всех детей на изменение состояния одного ребенка. Это прекрасно работает для 1 уровня вниз.

Есть ли другие способы решения этой проблемы?

1 Ответ

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

Вы можете просто позвонить всем детям, чтобы проверить, были ли они изменены.Затем они в свою очередь звонят своим детям, например,

public class Node
    {
        public List<Node> Children { get; set; } = new List<Node>();

        private bool _modified = false;

        public bool HasBeenModified
        {
            get => _modified || Children.Any(c => c.HasBeenModified);
            set => _modified = value;
        }
    }

Изменено, чтобы добавить рабочий пример.

public static void Main(string[] args)
    {
        var parentNode = new Node();
        var childNodeOne = new Node();
        var childNodeTwo = new Node();
        var childNodeOneOne = new Node();

        childNodeOne.Children.Add(childNodeOneOne);
        parentNode.Children.Add(childNodeOne);
        parentNode.Children.Add(childNodeTwo);

        // Check is currently not modified
        Console.WriteLine($"Check: {parentNode.HasBeenModified}");

        // Mark node 2 has modified and check again
        childNodeTwo.HasBeenModified = true;
        Console.WriteLine($"Check: {parentNode.HasBeenModified}");

        // Unmark node 2 and make sure it's no longer modified
        childNodeTwo.HasBeenModified = false;
        Console.WriteLine($"Check: {parentNode.HasBeenModified}");

        // Mark the second level child node as modified and check parent is also showing as modified
        childNodeOneOne.HasBeenModified = true;
        Console.WriteLine($"Check: {parentNode.HasBeenModified}");

        Console.ReadKey();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...