是否可以更改队列中的元素?

use*_*746 5 c# queue

假设我有一个整数队列(或任何类T),我可以更改队列中元素的值吗?更具体地说,如果我将队列定义如下:

Queue<int> q = new Queue<int>();
Run Code Online (Sandbox Code Playgroud)

我们可以更改其元素的值,类似于我们处理数组的方式吗?(如果q是一个数组,我们就可以做这样的事情:q[0]=1改变它的元素).我只是想简化场景并使用int作为示例,但我的目的是试图查看队列中T类的第1项,进行一些计算并更新队列以供其他程序处理.我不想将它出列,因为队列中的序列将与原始序列不同.希望我想要做的事情有意义.请指教.

Ser*_*rvy 6

如果队列中的项目是可变类型,那么您可以更改队列具有的第一个项目的值.在不重新创建队列或执行大量队列/队列的情况下,无法更改队列前面的哪个项目.

作为第一种情况的一个例子,如果你有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)

  • @ user1205746你*可以*,但你可能不应该.如果您需要访问除第一项以外的其他内容,则可能是您使用了错误的数据结构.`Queue`旨在为您提供第一项或每项,但不是第n项. (3认同)

svi*_*ick 5

您不能直接更改项目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 中的新功能)使用这种方法通过并行化提高性能。它可以做到这一点,因为如果您没有单个中央队列,每个模块都可以独立于其他模块处理项目。