Beispiel #1
0
        private static Node BuildTree(XmlTree source)
        {
            //Ищем все вершины, у которых нет родителей и имеются дети
            var detached = source.Nodes.Where(e => {
                var parents = source.Nodes.Where(q => q.Bonds.Contains(e.Id));
                if (parents.Count() == 0)
                {
                    return(true);
                }

                return(false);
            }).Where(e => e.Bonds.Count() > 0);

            if (detached.Count() != 1)
            {
                throw new Exception("Корень дерева не найден, задано более одного дерева или вершины дерева зациклены");
            }

            //Задаем корень
            var root = detached.FirstOrDefault();
            var node = new Node(root.Id, null);

            AddChildren(node, source);

            return(node);
        }
Beispiel #2
0
        private static void PrepareToBuild(XmlTree source)
        {
            var hash  = new HashSet <string>();
            var count = source.Nodes.Count();

            source.Nodes.ForEach(e => {
                if (string.IsNullOrWhiteSpace(e.Bond))
                {
                    e.Bonds = new List <int>();
                    return;
                }

                e.Bonds = e.Bond.Trim()
                          .Split(' ')
                          .Select(e =>
                {
                    if (hash.Contains(e))
                    {
                        throw new Exception($"Вершина {e} имеет более, чем одного родителя");
                    }

                    hash.Add(e);
                    return(Convert.ToInt32(e));
                })
                          .ToList();
            });
        }
Beispiel #3
0
        private static List <SimpleNode> BuildSimpleTree(XmlTree source)
        {
            //Ищем все вершины, у которых нет родителей и имеются дети
            var detached = source.Nodes.Where(e => {
                var parents = source.Nodes.Where(q => q.Bonds.Contains(e.Id));
                if (parents.Count() == 0)
                {
                    return(true);
                }

                return(false);
            }).Where(e => e.Bonds.Count() > 0);

            if (detached.Count() != 1)
            {
                throw new Exception("Корень дерева не найден, задано более одного дерева или вершины дерева зациклены");
            }

            //Задаем корень
            var root       = detached.FirstOrDefault();
            var simpleRoot = new SimpleNode(root.Id, null);

            foreach (var bond in root.Bonds)
            {
                simpleRoot.Add(bond);
            }

            var simpleTree = new List <SimpleNode>();

            simpleTree.Add(simpleRoot);

            AddSimpleChildren(simpleRoot, simpleTree, source);

            return(simpleTree);
        }
Beispiel #4
0
        /// <summary>
        /// Рекурсивно заполняем дерево
        /// </summary>
        /// <param name="node"></param>
        /// <param name="source"></param>
        private static void AddChildren(Node node, XmlTree source)
        {
            var bonds = source.Nodes.FirstOrDefault(e => e.Id == node.Id).Bonds;

            foreach (var id in bonds)
            {
                var child = new Node(id, node);
                AddChildren(child, source);
                node.Add(child);
            }
        }
Beispiel #5
0
        private static void AddSimpleChildren(SimpleNode sourceNode, List <SimpleNode> simpleTree, XmlTree source)
        {
            foreach (var id in sourceNode.Children)
            {
                var node       = source.Nodes.FirstOrDefault(e => e.Id == id);
                var simpleNode = new SimpleNode(id, sourceNode.Id);
                foreach (var bond in node.Bonds)
                {
                    simpleNode.Add(bond);
                }
                simpleTree.Add(simpleNode);

                AddSimpleChildren(simpleNode, simpleTree, source);
            }
        }