我发现不止一种情况,泛型集合需要在某个时间点被视为一个列表,而在另一个时间点被视为一个堆栈或队列。对于我目前正在开发的应用程序,使用三个单独的对象是没有意义的。
我能想到的最简单的解决方案是在标准 List 上实现 Queue/Dequeue/Push/Pop/Peek 函数。此外(不包括在下面的代码中),接口约束应用于 T 允许类维护每个列表、队列和堆栈的位置/序数索引。
public class List<T>:
System.Collections.Generic.List<T>
{
private object SyncRoot = new object();
public void Enqueue (T item)
{
lock (this.SyncRoot)
{
this.Add(item);
}
}
public T Dequeue ()
{
T item = default(T);
lock (this.SyncRoot)
{
if (this.Count > 0)
{
item = this [0];
this.RemoveAt(0);
}
}
return (item);
}
public void Push (T item)
{
lock (this.SyncRoot)
{
this.Add(item);
}
}
public T Pop ()
{
T item = default(T);
lock (this.SyncRoot)
{
if (this.Count > 0)
{
item = this [this.Count - 1];
this.RemoveAt(this.Count - 1);
}
}
return (item);
}
public T PeekQueue ()
{
T item = default(T);
lock (this.SyncRoot)
{
if (this.Count > 0)
{
item = this [0];
}
}
return (item);
}
public T PeekStack ()
{
T item = default(T);
lock (this.SyncRoot)
{
if (this.Count > 0)
{
item = this [this.Count - 1];
}
}
return (item);
}
}
- 由于这是一个粗略的即时实现,我不确定要注意哪些极端情况,因此我会欣赏指向任何现有此类实现的指针或链接。
- 其次,我对非常大的列表的性能持怀疑态度。从 List 继承的决定是否比对大型列表使用说 LinkedList 更好。就我而言,添加/删除项目比枚举列表具有更高的优先级。