示例#1
0
 //============================================================
 // <T>是否和指定链表内容相等。</T>
 //
 // @param list 链表
 // @return 是否相等
 //============================================================
 public bool Equals(FList <T> list)
 {
     // 检查参数
     if (null == list)
     {
         return(false);
     }
     // 检查总数
     if (_count != list._count)
     {
         return(false);
     }
     // 检查内容
     if (_count > 0)
     {
         int            index = 0;
         FListEntry <T> entry = _first;
         while (null != entry)
         {
             T value = list.Get(index);
             if (!value.Equals(entry.value))
             {
                 return(false);
             }
             entry = entry.next;
             index++;
         }
     }
     return(true);
 }
示例#2
0
 //============================================================
 // <T>追加一个链表。</T>
 //
 // @params list 链表
 //============================================================
 public void Append(FList <T> list)
 {
     if ((null != list) && !list.IsEmpty)
     {
         FListEntry <T> entry = list._first;
         while (null != entry)
         {
             Push(entry.value);
             entry = entry.next;
         }
     }
 }
示例#3
0
 //============================================================
 // <T>移动到下一个位置。</T>
 //
 // @return 是否移动成功
 //============================================================
 public bool MoveNext()
 {
     if (null == _current)
     {
         _current = _first;
     }
     else
     {
         _current = _current.next;
     }
     return(null != _current);
 }
示例#4
0
        //============================================================
        // <T>移除链表中的所有指定数据内容的项目。</T>
        //
        // @params value 数据内容
        //============================================================
        public void Remove(T value)
        {
            FListEntry <T> entry = _first;

            while (null != entry)
            {
                FListEntry <T> next = entry.next;
                if (entry.value.Equals(value))
                {
                    InnerRemove(entry);
                }
                entry = next;
            }
        }
示例#5
0
 //============================================================
 // <T>是否含有内容。</T>
 //
 // @param value 内容
 // @return 是否含有
 //============================================================
 public bool Contains(T value)
 {
     if ((null != value) && (_count > 0))
     {
         FListEntry <T> entry = _first;
         while (null != entry)
         {
             if (value.Equals(entry.value))
             {
                 return(true);
             }
             entry = entry.next;
         }
     }
     return(false);
 }
示例#6
0
 //============================================================
 // <T>获得索引位置的数据内容。</T>
 //
 // @param index 索引位置
 // @return 数据内容
 //============================================================
 public T Get(int index)
 {
     if (_count > 0)
     {
         int            position = 0;
         FListEntry <T> entry    = _first;
         while (null != entry)
         {
             entry = entry.next;
             if (position == index)
             {
                 return(entry.value);
             }
             position++;
         }
     }
     return(default(T));
 }
示例#7
0
 //============================================================
 // <T>获得内容的索引位置。</T>
 //
 // @param value 内容
 // @return 索引位置
 //============================================================
 public int IndexOf(T value)
 {
     if (_count > 0)
     {
         int            index = 0;
         FListEntry <T> entry = _first;
         while (null != entry)
         {
             if (value.Equals(entry.value))
             {
                 return(index);
             }
             entry = entry.next;
             index++;
         }
     }
     return(-1);
 }
示例#8
0
        //============================================================
        // <T>设置指定位置的值。</T>
        //
        // @params int 索引
        // @return Object 值
        //============================================================
        public void Set(int index, T value)
        {
            int _index = 0;
            T   result = default(T);

            if (_index > 0 && _index < _count)
            {
                FListEntry <T> entry = _first;
                while (null != entry)
                {
                    if (index == _index)
                    {
                        result      = entry.value;
                        entry.value = value;
                        break;
                    }
                    entry = entry.next;
                    index++;
                }
            }
        }
示例#9
0
 //============================================================
 // <T>压入数据内容到首部。</T>
 //
 // @parma value 数据内容
 //============================================================
 public void Unshift(T value)
 {
     if (null != value)
     {
         FListEntry <T> entry = new FListEntry <T>();
         entry.value = value;
         FListEntry <T> first = _first;
         if (null != first)
         {
             first.prior = entry;
         }
         else
         {
             _last = entry;
         }
         entry.prior = null;
         entry.next  = first;
         _first      = entry;
         _count++;
     }
 }
示例#10
0
 //============================================================
 // <T>压入数据内容到尾部。</T>
 //
 // @parma value 数据内容
 //============================================================
 public void Push(T value)
 {
     if (null != value)
     {
         FListEntry <T> entry = new FListEntry <T>();
         entry.value = value;
         FListEntry <T> last = _last;
         if (null != last)
         {
             last.next = entry;
         }
         else
         {
             _first = entry;
         }
         entry.prior = last;
         entry.next  = null;
         _last       = entry;
         _count++;
     }
 }
示例#11
0
        //============================================================
        // <T>弹出首数据内容。</T>
        //
        // @return 数据内容
        //============================================================
        public T Shift()
        {
            T value = default(T);
            FListEntry <T> entry = _first;

            if (null != entry)
            {
                value = entry.value;
                FListEntry <T> next = entry.next;
                if (null != next)
                {
                    next.prior = null;
                }
                else
                {
                    _last = null;
                }
                _first = next;
                _count--;
            }
            return(value);
        }
示例#12
0
        //============================================================
        // <T>弹出尾数据内容。</T>
        //
        // @return 数据内容
        //============================================================
        public T Pop()
        {
            T value = default(T);
            FListEntry <T> entry = _last;

            if (null != entry)
            {
                value = entry.value;
                FListEntry <T> prior = entry.prior;
                if (null != prior)
                {
                    prior.next = null;
                }
                else
                {
                    _first = null;
                }
                _last = prior;
                _count--;
            }
            return(value);
        }
示例#13
0
        //============================================================
        // <T>移除链表中的一个入口对象。</T>
        //
        // @param entry 入口对象
        //============================================================
        protected void InnerRemove(FListEntry <T> entry)
        {
            FListEntry <T> prior = entry.prior;
            FListEntry <T> next  = entry.next;

            if (null != prior)
            {
                prior.next = next;
            }
            else
            {
                _first = next;
            }
            if (null != next)
            {
                next.prior = prior;
            }
            else
            {
                _last = prior;
            }
            _count--;
        }
示例#14
0
        //============================================================
        // <T>获得调试转储信息。</T>
        //
        // @param info 转储信息
        // @return 转储信息
        //============================================================
        public virtual FDump Dump(FDump info)
        {
            info.Begin();
            info.Append("count=" + _count);
            // 追加所有项目
            info.Append(" {");
            bool           isFirst = true;
            FListEntry <T> entry   = _first;

            while (null != entry)
            {
                // 追加分隔符
                if (isFirst)
                {
                    isFirst = false;
                }
                else
                {
                    info.Append(", ");
                }
                // 追加内容
                T value = entry.value;
                if (value is IDump)
                {
                    ((IDump)value).Dump(info);
                }
                else
                {
                    info.Append(value);
                }
                entry = entry.next;
            }
            info.Append("}");
            info.End();
            return(info);
        }
示例#15
0
 //============================================================
 // <T>构造类型数组枚举器。</T>
 //
 // @param items 数据内存
 // @param offset 开始位置
 // @param count 数据长度
 //============================================================
 public FListEnumerator(FListEntry <T> first)
 {
     _first   = first;
     _current = null;
 }
示例#16
0
 //============================================================
 // <T>清除所有数据内容。</T>
 //============================================================
 public void Clear()
 {
     _first = _last = null;
     _count = 0;
 }
示例#17
0
 //============================================================
 // <T>重置枚举器。</T>
 //============================================================
 public void Reset()
 {
     _current = null;
 }