将队列中的每个项目乘以-1的优雅(简短)方法是什么(queue.ForEach似乎不存在),并且读取整个队列并将其写入另一个队列似乎过多。有没有办法在现场进行?
答案 0 :(得分:6)
编辑抛开:我不明白为什么这个问题被投票或投票结束。这是一个非常合理的问题。
如果你想做的就是获取队列中的元素否定:
var negated = myQueue.Select(x => -x);
foreach(int x in negated) ...
请注意,即使您更改了队列的内容,“negated”仍将继续有效!查询对象在枚举时进行评估,而不是在创建时进行评估。
请注意,myQueue
根本没有变化; negated
只是它的一个包装器,它会枚举枚举的元素。
答案 1 :(得分:2)
Queues的设计使得项目只能写入队列的后面(入队)或从队列的前面读取(查看/出队)。更改队列中间的项目根本不是已定义的操作。因此,即使存在ForEach
方法,也会破坏数据结构的目的。
在排队或排队时最好否定这些项目。如果您真的想要,可以编写扩展方法,例如:
public static class QueueExtensions
{
public static int DequeueAndNegate(this Queue<int> queue)
{
return queue.Dequeue() * -1;
}
// -- or --
public static void NegateAndEnqueue(this Queue<int> queue, int value)
{
queue.Enqueue(value * -1);
}
}
var queue = new Queue<int>(new[] { 1, 2, 3 });
while (queue.Count > 0)
{
Console.WriteLine(queue.DequeueAndNegate()); // -1 -2 -3
}
如果您确实需要允许就地修改项目的数据结构,则需要使用不同的数据结构,例如: List<int>
。