【发布时间】:2010-12-11 17:31:20
【问题描述】:
在 C# 中,我使用队列集合。我可以轻松地入队或出队。好的,现在我想在队列中间或队列开头插入一些东西。我没有找到任何方法来做这样的事情。您推荐什么作为备用系列?
【问题讨论】:
-
...别告诉我,你也是那些试图在超市中间排队的人之一? :) 我的观点是,队列的全部意义在于项目从一端进入,从另一端离开。现在,我将把它作为练习留给读者,以了解如何实现离开队列的人:)
在 C# 中,我使用队列集合。我可以轻松地入队或出队。好的,现在我想在队列中间或队列开头插入一些东西。我没有找到任何方法来做这样的事情。您推荐什么作为备用系列?
【问题讨论】:
根据定义,队列是您只能将事物入队和出队的事物。如果你想在中间插入,那么你需要一个完整的列表(可能是LinkedList<T>),而不是Queue。
我的意思是,你不会试图将自己“插入”到超市的队列中间(我希望如此);它在这里的工作方式相同。
【讨论】:
您要查找的是LinkedList<T>。您可以添加到列表的开头、中间(使用 AddBefore 或 AddAfter)或末尾。
这比使用 List<T> 更有优势,因为您可以使用 RemoveFirst 或 RemoveLast 让它更接近地模仿队列或堆栈。
【讨论】:
虽然此页面上的答案是正确的,但如果您发现自己处于无法使用队列以外的其他东西的位置,您可以(有一点开销)将项目添加到队列中间。是否应该做是另一回事。
var myQueue = new Queue<string>();
myQueue.Enqueue("item 0");
myQueue.Enqueue("item 10");
var myList = myQueue.ToList();
myList.Insert(1, "item 5");
myQueue = new Queue<string>(myList);
【讨论】:
Queue,所以任何引用旧队列的人都不会看到您的插入!有时是可以的,如果旧队列是“通过引用”传递的,并且没有其他人“松散”对旧队列的引用。后一个要求是问题所在:如果你不能改变你正在使用的类,你可能也不能保证你被允许创建一个新对象。在这种情况下,有必要将所有项目出列到临时列表中,插入,然后再次将它们全部入队。
您可能必须使用列表。
【讨论】:
队列的重点是提供 FIFO(先进先出)接口抽象。如果您希望能够以非队列方式与数据结构进行交互,请不要使用队列。
【讨论】:
如果您想插入队列的“中间”,您可能正在寻找“优先队列”。
不幸的是,这不是一个内置的 .Net 类,AFAIK。但至少现在你有了一个概念名称,可以搜索。
请参阅此(已关闭)问答以获取一些可能有用的链接:
Priority queue in .Net
引用那里的问题:
优先队列是比简单排序提供更多灵活性的数据结构,因为它们允许新元素以任意间隔进入系统。将新作业插入优先级队列比在每次到达时重新排序所有内容更具成本效益。
基本优先级队列支持三种主要操作:
- 插入(Q,x)。给定一个带有键 k 的项目 x,将其插入优先级队列 Q。
- 求最小值 (Q)。返回指向项目的指针 其键值小于优先级队列中的任何其他键 问。
- 删除-最小值(Q)。从优先级队列 Q 中移除 key 最小的 item
【讨论】: