2016-05-31 50 views
-1

什么是优雅的(短)的方式由-1乘以一个队列的每一个项目(queue.ForEach似乎并不存在)乘以所有项目,这似乎是过度念给整个队列并将其写入另一个队列。有没有办法做到这一点?C#队列-1

+0

'queue.ForEach'将是一个只读方法,不会做你想要的东西。 (就像'foreach') –

+3

嗯,不,这是-100点使用了错误的集合对象。当你不解释为什么你认为你需要这样做时,很难得到0以上的结果。 –

+0

同意@HansPassant,你可能使用了错误的集合。你会做什么是浪费,你确定为什么会这样..... – FirebladeDan

回答

6

编辑旁白:我不明白为什么这个问题是downvoted或投票决定关闭。这是一个完全合理的问题。

如果你想要做的是获得在队列中的元素否定:

var negated = myQueue.Select(x => -x); 
foreach(int x in negated) ... 

需要注意的是“否定”将继续即使您更改队列的内容合作!查询对象在枚举时评估,而不是在创建时评估。

注意myQueue是没有改变; negated仅仅是它周围的包装,否定的元素,因为它们是枚举。

2

Queues被设计成只能将一个项目写入队列的后面(入队)或从队列的前面读取(peek/dequeue)。更改队列中间的项目不是定义的操作。所以即使存在一个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>