예제 #1
0
파일: MarcNode.cs 프로젝트: renyh/dp2mini
 /// <summary>
 /// 向当前集合中添加一个节点元素,按节点名字顺序决定加入的位置
 /// </summary>
 /// <param name="node">要加入的节点</param>
 /// <param name="style">如何加入</param>
 /// <param name="comparer">用于比较大小的接口</param>
 public override void insertSequence(MarcNode node,
                                     InsertSequenceStyle style     = InsertSequenceStyle.PreferHead,
                                     IComparer <MarcNode> comparer = null)
 {
     base.insertSequence(node, style, comparer);
     node.Parent = owner;
 }
예제 #2
0
        public virtual void insertSequenceReverse(MarcNode node,
                                                  InsertSequenceStyle style     = InsertSequenceStyle.PreferHead,
                                                  IComparer <MarcNode> comparer = null)
        {
            if (comparer == null)
            {
                comparer = new MarcNodeComparer();
            }

            // 寻找插入位置
            List <int> values     = new List <int>(); // 累积每个比较结果数字
            int        nInsertPos = -1;

            for (int i = this.count - 1; i >= 0; i--)
            {
                MarcNode current = this[i];

                int nBigThanCurrent = 0;   // 相当于node和当前对象相减

                nBigThanCurrent = comparer.Compare(node, current) * -1;
                if (nBigThanCurrent < 0)
                {
                    nInsertPos = i + 1;
                    break;
                }
                if (nBigThanCurrent == 0)
                {
                    if ((style & InsertSequenceStyle.PreferTail) != 0)
                    {
                        nInsertPos = i;
                        break;
                    }
                }

                // 刚刚遇到过相等的一段,但在当前位置结束了相等 (或者开始变大,或者开始变小)
                if (nBigThanCurrent != 0 && values.Count > 0 && values[values.Count - 1] == 0)
                {
                    if ((style & InsertSequenceStyle.PreferHead) != 0)
                    {
                        nInsertPos = i;
                        break;
                    }
                }

                values.Add(nBigThanCurrent);
            }

            if (nInsertPos == -1)
            {
                this.m_list.Insert(0, node);
                return;
            }

            this.m_list.Insert(nInsertPos, node);
        }
예제 #3
0
파일: MarcNode.cs 프로젝트: paopaofeng/dp2
     /// <summary>
     /// 向当前集合中添加一个节点元素,按节点名字顺序决定加入的位置
     /// </summary>
     /// <param name="node">要加入的节点</param>
     /// <param name="style">如何加入</param>
     /// <param name="comparer">用于比较大小的接口</param>
     public override void insertSequence(MarcNode node,
 InsertSequenceStyle style = InsertSequenceStyle.PreferHead,
 IComparer<MarcNode> comparer = null)
     {
         base.insertSequence(node, style, comparer);
         node.Parent = owner;
     }