【发布时间】:2012-09-12 11:58:02
【问题描述】:
我发现不止一种情况,泛型集合需要在某个时间点被视为列表,而在另一个时间点被视为堆栈或队列。对于我目前正在开发的应用程序,使用三个单独的对象是没有意义的。
我能想到的最简单的解决方案是在标准 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 更好。就我而言,添加/删除项目比枚举列表具有更高的优先级。
【问题讨论】:
-
注意:我确实意识到这样一个类不会成为其他开发人员使用的好选择,因为结合列表、队列和堆栈的功能可能会非常违反直觉,具体取决于您如何使用它们.
-
@hagensoft:我似乎无法访问页面内容。它仅部分加载。请把要点贴在这里好吗?
-
您具体要求列表的哪个方面?是按索引访问吗?对于队列/堆栈的组合,听起来您要求的是一个双端队列(您可以在其中添加、删除和查看任一端的项目),对吗?
-
@Damien_The_Unbeliever:实际上都是。双端队列加上索引任意访问。