Пример #1
0
        private void DoGetNodesOnDepthIndex(ref IList <MNode <TVal> > list, MNode <TVal> curNode, int curDepthIndex, int targetDepthIndex)
        {
            if (curDepthIndex == (targetDepthIndex - 1))
            {
                foreach (MNode <TVal> child in curNode.Children)
                {
                    list.Add(child);
                }

                return;
            }

            foreach (MNode <TVal> child in curNode.Children)
            {
                this.DoGetNodesOnDepthIndex(ref list, child, curDepthIndex + 1, targetDepthIndex);
            }
        }
Пример #2
0
        public IList <MNode <TVal> > GetOffsprings(string valID)
        {
            using (this.SmartRWLocker.Lock(AccessMode.Read))
            {
                MNode <TVal> curNode = this.GetNodeByID(valID);
                if (curNode == null)
                {
                    return(null);
                }

                IList <MNode <TVal> > list = new List <MNode <TVal> >();

                this.DoGetOffsprings(curNode, ref list);

                return(list);
            }
        }
Пример #3
0
        public MNode <TVal> EnsureNodeExist(string nodeSequenceCode)
        {
            using (base.SmartRWLocker.Lock(AccessMode.Write))
            {
                MNode <TVal> target = base.GetNodeByPath(nodeSequenceCode, this.sequenceCodeSplitter);
                if (target != null)
                {
                    return(target);
                }

                string[] uppers = nodeSequenceCode.Split(this.sequenceCodeSplitter);
                if ((uppers[0] != base.Root.TheValue.CurrentID) || (uppers.Length < 2))
                {
                    return(null);
                }

                return(this.AppendOffSprings(nodeSequenceCode, uppers));
            }
        }
Пример #4
0
        private MNode <TVal> DOAppendOffSprings(MNode <TVal> current, string[] offSpringIDs, int startIndex)
        {
            MNode <TVal> temp = current;

            for (int i = startIndex; i < offSpringIDs.Length; i++)
            {
                TVal child = this.agileNodePicker.Retrieve(offSpringIDs[i]);
                if (child == null)
                {
                    return(null);
                }
                else
                {
                    temp = temp.AddChild(child);
                }
            }

            return(temp);
        }
Пример #5
0
        private MNode <TVal> DoGetNode(MNode <TVal> curNode, string ValID)
        {
            foreach (MNode <TVal> node in curNode.Children)
            {
                if (node.TheValue.CurrentID == (ValID))
                {
                    return(node);
                }
            }

            foreach (MNode <TVal> node in curNode.Children)
            {
                MNode <TVal> target = this.DoGetNode(node, ValID);
                if (target != null)
                {
                    return(target);
                }
            }

            return(null);
        }
Пример #6
0
        public IList <MNode <TVal> > GetNodesOnDepthIndex(string idPath, char separator, int depthIndex)
        {
            using (this.SmartRWLocker.Lock(AccessMode.Read))
            {
                string[] pathAry          = idPath.Split(separator);
                int      parentDepthIndex = pathAry.Length - 1;

                if (parentDepthIndex > depthIndex)
                {
                    return(null);
                }

                MNode <TVal> target = this.GetNodeByPath(idPath, separator);
                if (target == null)
                {
                    return(null);
                }

                MultiTree <TVal> childTree = new MultiTree <TVal>();
                childTree.Initialize(target);

                return(childTree.GetNodesOnDepthIndex(depthIndex - parentDepthIndex));
            }
        }
Пример #7
0
 /// <summary>
 /// Initialize 使用已经存在的某个树(或子树)来构造一个新树。
 /// </summary>
 public virtual void Initialize(MNode <TVal> _rootNode)
 {
     this.root = _rootNode;
 }
Пример #8
0
 public MNode(TVal val, MNode <TVal> _parent)
 {
     this.theValue = val;
     this.parent   = _parent;
 }