456 lines
14 KiB
C#
456 lines
14 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Runtime.InteropServices;
|
|||
|
|
|
|||
|
|
namespace Convention.Collections
|
|||
|
|
{
|
|||
|
|
namespace Generic
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <typeparam name="T">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD></typeparam>
|
|||
|
|
public sealed class LinkedCacheList<T> : ICollection<T>, IEnumerable<T>, ICollection, IEnumerable
|
|||
|
|
{
|
|||
|
|
private readonly LinkedList<T> m_LinkedList;
|
|||
|
|
/// <summary>
|
|||
|
|
/// ֮<><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><D7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>
|
|||
|
|
/// <list type="bullet"><3E><><EFBFBD><EFBFBD> GC ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>/ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD><DCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĽڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>йܶѵķ<D1B5><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><D5B4><EFBFBD></list>
|
|||
|
|
/// <list type="bullet"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5> new <20><> GC<47><43><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD>ͣ<EFBFBD><CDA3>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD></list>
|
|||
|
|
/// <list type="bullet"><3E><><EFBFBD>ڹ۲<DAB9><DBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB>ṩ<EFBFBD><E1B9A9> CachedNodeCount <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ҫʱ<D2AA><CAB1>ͨ<EFBFBD><CDA8> ClearCachedNodes <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD></list>
|
|||
|
|
/// <20><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>ǽڵ<C7BD>ʹ<EFBFBD><CAB9>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ޡ<EFBFBD><DEA1><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʼ<C4A3><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD>ͷţ<CDB7><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ͡<CFB5>
|
|||
|
|
/// </summary>
|
|||
|
|
private readonly Queue<LinkedListNode<T>> m_CachedNodes;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
/// </summary>
|
|||
|
|
public LinkedCacheList()
|
|||
|
|
{
|
|||
|
|
m_LinkedList = new LinkedList<T>();
|
|||
|
|
m_CachedNodes = new Queue<LinkedListNode<T>>();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public int Count
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_LinkedList.Count;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㻺<EFBFBD><E3BBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public int CachedNodeCount
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_CachedNodes.Count;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public LinkedListNode<T> First
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_LinkedList.First;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public LinkedListNode<T> Last
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_LinkedList.Last;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡһ<C8A1><D2BB>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ֵָʾ <see cref="ICollection{T}"/> <20>Ƿ<EFBFBD>Ϊֻ<CEAA><D6BB>
|
|||
|
|
/// </summary>
|
|||
|
|
public bool IsReadOnly
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return ((ICollection<T>)m_LinkedList).IsReadOnly;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD> <see cref="ICollection"/> <20>ķ<EFBFBD><C4B7>ʵĶ<CAB5><C4B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public object SyncRoot
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return ((ICollection)m_LinkedList).SyncRoot;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡһ<C8A1><D2BB>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ֵָʾ<D6B8>Ƿ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD> <see cref="ICollection"/> <20>ķ<EFBFBD><C4B7>ʣ<EFBFBD><CAA3>̰߳<DFB3>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public bool IsSynchronized
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return ((ICollection)m_LinkedList).IsSynchronized;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="node">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD></param>
|
|||
|
|
/// <param name="value">ָ<><D6B8>ֵ</param>
|
|||
|
|
/// <returns><3E><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD>½<EFBFBD><C2BD><EFBFBD></returns>
|
|||
|
|
public LinkedListNode<T> AddAfter(LinkedListNode<T> node, T value)
|
|||
|
|
{
|
|||
|
|
LinkedListNode<T> newNode = AcquireNode(value);
|
|||
|
|
m_LinkedList.AddAfter(node, newNode);
|
|||
|
|
return newNode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="node">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD></param>
|
|||
|
|
/// <param name="newNode">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD></param>
|
|||
|
|
public void AddAfter(LinkedListNode<T> node, LinkedListNode<T> newNode)
|
|||
|
|
{
|
|||
|
|
m_LinkedList.AddAfter(node, newNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="node">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD></param>
|
|||
|
|
/// <param name="value">ָ<><D6B8>ֵ</param>
|
|||
|
|
/// <returns><3E><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD>½<EFBFBD><C2BD><EFBFBD></returns>
|
|||
|
|
public LinkedListNode<T> AddBefore(LinkedListNode<T> node, T value)
|
|||
|
|
{
|
|||
|
|
LinkedListNode<T> newNode = AcquireNode(value);
|
|||
|
|
m_LinkedList.AddBefore(node, newNode);
|
|||
|
|
return newNode;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="node">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD></param>
|
|||
|
|
/// <param name="newNode">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD></param>
|
|||
|
|
public void AddBefore(LinkedListNode<T> node, LinkedListNode<T> newNode)
|
|||
|
|
{
|
|||
|
|
m_LinkedList.AddBefore(node, newNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="value">ָ<><D6B8>ֵ</param>
|
|||
|
|
/// <returns><3E><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD>½<EFBFBD><C2BD><EFBFBD></returns>
|
|||
|
|
public LinkedListNode<T> AddFirst(T value)
|
|||
|
|
{
|
|||
|
|
LinkedListNode<T> node = AcquireNode(value);
|
|||
|
|
m_LinkedList.AddFirst(node);
|
|||
|
|
return node;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="node">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD></param>
|
|||
|
|
public void AddFirst(LinkedListNode<T> node)
|
|||
|
|
{
|
|||
|
|
m_LinkedList.AddFirst(node);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="value">ָ<><D6B8>ֵ</param>
|
|||
|
|
/// <returns><3E><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD>½<EFBFBD><C2BD><EFBFBD></returns>
|
|||
|
|
public LinkedListNode<T> AddLast(T value)
|
|||
|
|
{
|
|||
|
|
LinkedListNode<T> node = AcquireNode(value);
|
|||
|
|
m_LinkedList.AddLast(node);
|
|||
|
|
return node;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="node">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD></param>
|
|||
|
|
public void AddLast(LinkedListNode<T> node)
|
|||
|
|
{
|
|||
|
|
m_LinkedList.AddLast(node);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void Clear()
|
|||
|
|
{
|
|||
|
|
LinkedListNode<T> current = m_LinkedList.First;
|
|||
|
|
while (current != null)
|
|||
|
|
{
|
|||
|
|
ReleaseNode(current);
|
|||
|
|
current = current.Next;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_LinkedList.Clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㻺<EFBFBD><E3BBBA>
|
|||
|
|
/// </summary>
|
|||
|
|
public void ClearCachedNodes()
|
|||
|
|
{
|
|||
|
|
m_CachedNodes.Clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// ȷ<><C8B7>ijֵ<C4B3>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="value">ָ<><D6B8>ֵ</param>
|
|||
|
|
/// <returns>ijֵ<C4B3>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
|||
|
|
public bool Contains(T value)
|
|||
|
|
{
|
|||
|
|
return m_LinkedList.Contains(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ݵ<EFBFBD>һά<D2BB><CEAC><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="array">һά<D2BB><CEAC><EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>Ԫ<EFBFBD>ص<EFBFBD>Ŀ<EFBFBD>ꡣ<EFBFBD><EAA1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>㿪ʼ<E3BFAA><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
|||
|
|
/// <param name="index">array <20>д<EFBFBD><D0B4>㿪ʼ<E3BFAA><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ˴<D3B4><CBB4><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD></param>
|
|||
|
|
public void CopyTo(T[] array, int index)
|
|||
|
|
{
|
|||
|
|
m_LinkedList.CopyTo(array, index);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ض<EFBFBD><D8B6><EFBFBD> ICollection <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8>Ƶ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="array">һά<D2BB><CEAC><EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD>Ǵ<EFBFBD> ICollection <20><><EFBFBD>Ƶ<EFBFBD>Ԫ<EFBFBD>ص<EFBFBD>Ŀ<EFBFBD>ꡣ<EFBFBD><EAA1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>㿪ʼ<E3BFAA><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
|||
|
|
/// <param name="index">array <20>д<EFBFBD><D0B4>㿪ʼ<E3BFAA><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ˴<D3B4><CBB4><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD></param>
|
|||
|
|
public void CopyTo(Array array, int index)
|
|||
|
|
{
|
|||
|
|
((ICollection)m_LinkedList).CopyTo(array, index);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>Ұ<EFBFBD><D2B0><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="value">Ҫ<><D2AA><EFBFBD>ҵ<EFBFBD>ָ<EFBFBD><D6B8>ֵ</param>
|
|||
|
|
/// <returns><3E><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
|||
|
|
public LinkedListNode<T> Find(T value)
|
|||
|
|
{
|
|||
|
|
return m_LinkedList.Find(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>Ұ<EFBFBD><D2B0><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="value">Ҫ<><D2AA><EFBFBD>ҵ<EFBFBD>ָ<EFBFBD><D6B8>ֵ</param>
|
|||
|
|
/// <returns><3E><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
|||
|
|
public LinkedListNode<T> FindLast(T value)
|
|||
|
|
{
|
|||
|
|
return m_LinkedList.FindLast(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>ָ<EFBFBD><D6B8>ֵ<EFBFBD>ĵ<EFBFBD>һ<EFBFBD><D2BB>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="value">ָ<><D6B8>ֵ</param>
|
|||
|
|
/// <returns><3E>Ƿ<EFBFBD><C7B7>Ƴ<EFBFBD><C6B3>ɹ<EFBFBD></returns>
|
|||
|
|
public bool Remove(T value)
|
|||
|
|
{
|
|||
|
|
LinkedListNode<T> node = m_LinkedList.Find(value);
|
|||
|
|
if (node != null)
|
|||
|
|
{
|
|||
|
|
m_LinkedList.Remove(node);
|
|||
|
|
ReleaseNode(node);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="node">ָ<><D6B8><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD></param>
|
|||
|
|
public void Remove(LinkedListNode<T> node)
|
|||
|
|
{
|
|||
|
|
m_LinkedList.Remove(node);
|
|||
|
|
ReleaseNode(node);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƴ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void RemoveFirst()
|
|||
|
|
{
|
|||
|
|
LinkedListNode<T> first = m_LinkedList.First;
|
|||
|
|
if (first == null)
|
|||
|
|
{
|
|||
|
|
throw new InvalidOperationException("Rmove first is invalid.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_LinkedList.RemoveFirst();
|
|||
|
|
ReleaseNode(first);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƴ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ľ<EFBFBD><C4BD>㡣
|
|||
|
|
/// </summary>
|
|||
|
|
public void RemoveLast()
|
|||
|
|
{
|
|||
|
|
LinkedListNode<T> last = m_LinkedList.Last;
|
|||
|
|
if (last == null)
|
|||
|
|
{
|
|||
|
|
throw new InvalidOperationException("Remove last is invalid.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_LinkedList.RemoveLast();
|
|||
|
|
ReleaseNode(last);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ϵ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns>ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ϵ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD></returns>
|
|||
|
|
public Enumerator GetEnumerator()
|
|||
|
|
{
|
|||
|
|
return new Enumerator(m_LinkedList);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private LinkedListNode<T> AcquireNode(T value)
|
|||
|
|
{
|
|||
|
|
LinkedListNode<T> node = null;
|
|||
|
|
if (m_CachedNodes.Count > 0)
|
|||
|
|
{
|
|||
|
|
node = m_CachedNodes.Dequeue();
|
|||
|
|
node.Value = value;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
node = new LinkedListNode<T>(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return node;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void ReleaseNode(LinkedListNode<T> node)
|
|||
|
|
{
|
|||
|
|
node.Value = default(T);
|
|||
|
|
m_CachedNodes.Enqueue(node);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ֵ<EFBFBD><D6B5><EFBFBD>ӵ<EFBFBD> ICollection`1 <20>Ľ<EFBFBD>β<EFBFBD><CEB2>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="value">Ҫ<><D2AA><EFBFBD>ӵ<EFBFBD>ֵ</param>
|
|||
|
|
void ICollection<T>.Add(T value)
|
|||
|
|
{
|
|||
|
|
AddLast(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ϵ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns>ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ϵ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD></returns>
|
|||
|
|
IEnumerator<T> IEnumerable<T>.GetEnumerator()
|
|||
|
|
{
|
|||
|
|
return GetEnumerator();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ϵ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns>ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ϵ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD></returns>
|
|||
|
|
IEnumerator IEnumerable.GetEnumerator()
|
|||
|
|
{
|
|||
|
|
return GetEnumerator();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ϵ<EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
[StructLayout(LayoutKind.Auto)]
|
|||
|
|
public struct Enumerator : IEnumerator<T>, IEnumerator
|
|||
|
|
{
|
|||
|
|
private LinkedList<T>.Enumerator m_Enumerator;
|
|||
|
|
|
|||
|
|
internal Enumerator(LinkedList<T> linkedList)
|
|||
|
|
{
|
|||
|
|
if (linkedList == null)
|
|||
|
|
{
|
|||
|
|
throw new InvalidOperationException("Linked list is invalid.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_Enumerator = linkedList.GetEnumerator();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public T Current
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_Enumerator.Current;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
object IEnumerator.Current
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_Enumerator.Current;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void Dispose()
|
|||
|
|
{
|
|||
|
|
m_Enumerator.Dispose();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
|||
|
|
public bool MoveNext()
|
|||
|
|
{
|
|||
|
|
return m_Enumerator.MoveNext();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
void IEnumerator.Reset()
|
|||
|
|
{
|
|||
|
|
((IEnumerator<T>)m_Enumerator).Reset();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|