奇怪的是,堆栈集合似乎缺少相当基本的转换和非移位方法*而且我在2.0中工作,所以我不能只扩展它们。
是否有合理的技术或替代集合类可以获得这些方法?我也需要推送和弹出。
编辑:看起来我想要的集合确实是deque,它很高兴不是C#原生的:(
此时不能使用第三方库,所以我将使用笨重的LinkedList(我说笨重,因为读取和移除是两个操作,其中shift将是一个)但我想我建议使用PowerCollections方法对任何可以使用它的人。或者更好的是,升级到扩展方法。
叹息
*道歉,我没有意识到这些是不常见的术语,我以为我只是不知道在API中找到它们的位置。供参考:
shift =删除第一个元素
unshift =在收集开始时插入元素
答案 0 :(得分:14)
我想说使用LinkedList<T>
。它具有从前面添加和移除的方法,以及从后面添加和移除的方法。我从来没有听说过移动和不移动,但我认为这就是它的含义。
答案 1 :(得分:9)
从未听说过堆叠中的移位/取消移位。 Stack类确实提供了Pop
,Peek
和Push
。
答案 2 :(得分:6)
如果你想要一个shift / unshift方法,你使用的是错误的类。 stack
是后进先出(LIFO)数据结构。
如果您想要在不使用pop和push的情况下进行shift / unshift,请使用Queue
。如果您想要两者,我建议您使用PowerCollections库中的Deque
答案 3 :(得分:1)
只要您使用C#3.0定位2.0,就可以fake extension methods。
你能描述一下班次/非移位操作是什么吗?
答案 4 :(得分:1)
根据定义 Stack 类表示使用后进先出(LIFO)技术管理集合中元素的方法,用于添加和删除元素。 LIFO只是意味着添加到集合中的最后一个元素将自动成为第一个被删除的元素。
您想要的功能是自定义的,但可以通过以下方式轻松实现
public class MyStack<T>:Stack<T>{
public void Shift(T item){
// load stack into internal ordered list
// clear stack content
// insert into internal list at desired location
// populate stack with content from internal list
}
public void Unshift(T item){
// load stack into internal ordered list
// clear stack content
// insert into internal list at desired location
// populate stack with content from internal list
}
}
似乎这就是全部:)
答案 5 :(得分:1)
这不是最好的,但它接近于一个带有shift / unshift和push / pop的Javascript数组。它不会隐藏内部工作,您可以索引任何您想要的项目。我有基本的功能。
public class JSList<T> : List<T>
{
public JSList() : base() {}
/// <summary>
/// this the add item to the start of the list
/// </summary>
/// <param name="v"></param>
public void Shift(T v)
{
this.Insert(0, v);
}
/// <summary>
/// remove item at the start of the list
/// </summary>
/// <returns></returns>
public T Unshift()
{
var toreturn = default(T);
if (this.Count > 0)
{
toreturn = this[0];
this.RemoveAt(0);
}
return toreturn;
}
/// <summary>
/// Adds object to end of the list
/// </summary>
/// <param name="v"></param>
public void Push(T v)
{
this.Add(v);
}
/// <summary>
/// removes an item at the end of the list
/// </summary>
/// <returns></returns>
public T Pop()
{
var toreturn = default(T);
if (this.Count > 0)
{
toreturn = this[this.Count - 1];
this.RemoveAt(this.Count - 1);
}
return toreturn;
}
public T Peek()
{
return this[this.Count - 1];
}
}
答案 6 :(得分:0)
Shift ==> Stack.Pop
Unshift ==> Stack.Push
Unshift
不会返回堆栈中的元素数量,您拥有Stack.Count
属性。
此外,还有Stack.Peek
,以获取第一个元素而不删除它。