假设我有一个整数队列(或任何类T),我可以更改队列中元素的值吗?更具体地说,如果我将队列定义如下:
Queue<int> q = new Queue<int>();
Run Code Online (Sandbox Code Playgroud)
我们可以更改其元素的值,类似于我们处理数组的方式吗?(如果q是一个数组,我们就可以做这样的事情:q[0]=1改变它的元素).我只是想简化场景并使用int作为示例,但我的目的是试图查看队列中T类的第1项,进行一些计算并更新队列以供其他程序处理.我不想将它出列,因为队列中的序列将与原始序列不同.希望我想要做的事情有意义.请指教.
如果队列中的项目是可变类型,那么您可以更改队列具有的第一个项目的值.在不重新创建队列或执行大量队列/队列的情况下,无法更改队列前面的哪个项目.
作为第一种情况的一个例子,如果你有Queue<MyClass>一个定义为:
class MyClass
{
public string Value { get; set; }
}
Queue<MyClass> queue = new Queue<MyClass>();
queue.Enqueue(new MyClass() { Value = "1" });
queue.Peek().Value = 2;
string value = queue.Peek().Value; // is 2
Run Code Online (Sandbox Code Playgroud)
您不能直接更改项目Queue(尽管您可以使用Tudor 建议的解决方法)。但是如果你想要一个队列,你就不必使用Queue. .Net 的另一种可能类型是LinkedList. 它允许您从两端添加和删除内容,可以在您的场景中使用:
LinkedList<int> list = new LinkedList<int>();
// enqueue an item
list.AddLast(1);
// dequeue an item
var item = list.First.Value;
list.RemoveFirst();
// put item back to the front of the queue
list.AddFirst(item);
Run Code Online (Sandbox Code Playgroud)
似乎您想这样做以按顺序处理多个模块的每个项目。但我不确定这是做这种工作的正确方法。更好的方法可能是在每两个模块之间设置一个队列。一个模块总是从它的输入队列中取出一个项目,处理它,然后把它放到它的输出队列中。
这种方法的优点之一是更大的灵活性:模块的输出类型可以与输入类型不同,这在“一个队列”方法中是不可能的(除非您使用objects 或类似的队列)那)。
TPL Dataflow(.Net 4.5 中的新功能)使用这种方法通过并行化提高性能。它可以做到这一点,因为如果您没有单个中央队列,每个模块都可以独立于其他模块处理项目。