118 lines
3.1 KiB
C#
118 lines
3.1 KiB
C#
using System;
|
||
|
||
namespace CRVM.Entity
|
||
{
|
||
/// <summary>
|
||
/// 一种环型数组,其长度N在创建后固定,当数组填充满时,继续添加的新元素会覆盖旧元素,
|
||
/// 数组内始终存储最新添加的N个元素。
|
||
/// </summary>
|
||
/// <typeparam name="T">元素类型</typeparam>
|
||
public class RollingArray<T>
|
||
{
|
||
/// <summary>
|
||
/// 泛型数组,用于存储各元素
|
||
/// </summary>
|
||
private T[] array;
|
||
|
||
/// <summary>
|
||
/// 下一个元素的写入位置
|
||
/// </summary>
|
||
private int nextPosition;
|
||
/// <summary>
|
||
/// 数组大小
|
||
/// </summary>
|
||
private int size;
|
||
|
||
/// <summary>
|
||
/// 数组中元素数量
|
||
/// </summary>
|
||
public int Count { get; private set; }
|
||
|
||
/// <summary>
|
||
/// 构造一个指定长度的泛型数组
|
||
/// </summary>
|
||
/// <param name="arraySize">数组大小</param>
|
||
public RollingArray(int arraySize)
|
||
{
|
||
size = arraySize;
|
||
array = new T[arraySize];
|
||
}
|
||
|
||
/// <summary>
|
||
/// 往数组中添加元素,每写入一个元素,下一次写入位置后移一位,当超出边界时又从头开始覆盖写入。
|
||
/// </summary>
|
||
/// <param name="element">待添加元素</param>
|
||
public void Add(T element)
|
||
{
|
||
array[nextPosition] = element;
|
||
nextPosition = (nextPosition + 1) % size;
|
||
|
||
if (Count < size)
|
||
Count++;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 数组中是否存在元素
|
||
/// </summary>
|
||
public bool IsEmpty
|
||
{
|
||
get { return Count == 0; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 循环数组的头,返回最早添加的元素
|
||
/// </summary>
|
||
public T Head
|
||
{
|
||
get
|
||
{
|
||
if (IsEmpty)
|
||
throw new IndexOutOfRangeException("当前数组为空!");
|
||
if (Count < size)
|
||
return array[0];
|
||
return array[nextPosition];
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 循环数组尾,返回最新添加的元素
|
||
/// </summary>
|
||
public T Tail
|
||
{
|
||
get
|
||
{
|
||
if (IsEmpty)
|
||
throw new IndexOutOfRangeException("当前数组为空!");
|
||
if (nextPosition == 0)
|
||
return array[Count];
|
||
return array[nextPosition - 1];
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 按照元素的插入顺序输出完整数组
|
||
/// </summary>
|
||
public T[] ToArray()
|
||
{
|
||
T[] temp = new T[Count];
|
||
for (int i = 0; i < Count; i++)
|
||
{
|
||
if (Count < size)
|
||
temp[i] = array[i];
|
||
else
|
||
temp[i] = array[(i + nextPosition) % size];
|
||
}
|
||
return temp;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 数组重置
|
||
/// </summary>
|
||
public void Clear()
|
||
{
|
||
nextPosition = 0;
|
||
Count = 0;
|
||
}
|
||
|
||
}
|
||
}
|