我有一个 System.Collection.Generic.Queue<int>
使用以下示例代码
Queue<int> iq = new Queue<int>();
iq.Enqueue(1); // 1
iq.Enqueue(2); // 1 2
iq.Enqueue(3); // 1 2 3
//move 1 to the end of the line here
int i = iq.Dequeue(); // 2 3
我想移动值(访问值)1
回到行尾,结果是 2
和 1
将是最后一个可出列的值。
有什么想法吗?有没有类似 iq.MoveToLast(1)
的东西?
如果你想Remove
/Add
项目的值,你可以使用List<T>
而不是 Queue<T>
:
List<int> id = ...
int itemToMove = 2;
int index = id.IndexOf(itemToMove);
// If we have item found we should put it at the end
if (index >= 0) {
id.Add(id[index]);
id.RemoveAt(index);
}
如果您必须使用 Queue<T>
你可以创建一个时间 List<T>
:
Queue<int> iq = ...
int itemToMove = 2;
// Create temporal list
var list = iq.ToList();
// process items in it
int index = list.IndexOf(itemToMove);
if (index >= 0) {
list.Add(list[index]);
list.RemoveAt(index);
}
// enqueue items back into queue in the desired order
iq.Clear();
foreach (var item in list)
iq.Enqueue(item);
最后,您可以实现一个扩展方法:
public static partial class QueueExtensions {
public static void MoveToLast<T>(this Queue<int> queue, T itemToMove) {
if (null == queue)
throw new ArgumentNullException(nameof(queue));
var list = queue.ToList();
int index = list.IndexOf(itemToMove);
if (index < 0)
return; // Nothing to do
list.Add(list[index]);
list.RemoveAt(index);
queue.Clear();
foreach (var item in list)
queue.Enqueue(item);
}
}
然后你可以把
iq.MoveToLast(1);
我是一名优秀的程序员,十分优秀!