C#队列将所有项目乘以-1

时间:2016-05-31 16:03:34

标签: c# queue

将队列中的每个项目乘以-1的优雅(简短)方法是什么(queue.ForEach似乎不存在),并且读取整个队列并将其写入另一个队列似乎过多。有没有办法在现场进行?

2 个答案:

答案 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>