2016-05-31 8 views
-1

キューの各項目に-1を乗じるエレガント(短い)方法(queue.ForEachは存在しないようです)は、キュー全体それを別のキューに書き込むことができます。インプレースでそれを行う方法はありますか?C#queueすべての項目に-1を掛けます。

+0

'queue.ForEach'は読み込み専用のメソッドであり、とにかくやりたいことをしません。 (ちょうど 'foreach'のように) –

+3

うーん、間違ったコレクションオブジェクトを使用すると-100ポイントはありません。なぜあなたはあなたがこれを行う必要があると思うかを説明していないとき、0より上になることは非常に困難です。 –

+0

@HansPassantに同意すると、間違ったコレクションが使用されている可能性があります。あなたがやっていることは無駄で、なぜそれが.....であるのかを特定しました。 – FirebladeDan

答えて

6

編集:私はこの質問がなぜ落とされたのか、または投票に投票したのか分かりません。それは完全に合理的な質問です。

あなたがしたいすべてがキュー内の要素を取得している場合は否定:「否定」は、キューの内容を変更しても動作し続けること

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 
} 

あなたが本当に例えば、あなたは別のデータ構造を使用する必要があり、アイテム自体の変更を可能にするデータ構造が必要な場合a List<int>

関連する問題