Was ist eine elegante (kurze) Möglichkeit, jedes Element einer Warteschlange mit -1 zu multiplizieren (queue.ForEach scheint nicht zu existieren) und es scheint übermäßig zu sein, in die gesamte Warteschlange zu lesen und um es in eine andere Warteschlange zu schreiben. Gibt es eine Möglichkeit, es an Ort und Stelle zu tun?C# -Warteschlange multiplizieren Sie alle Elemente mit -1
Antwort
Editorial beiseite: Ich sehe nicht, warum diese Frage abgelehnt oder abgestimmt wird, um zu schließen. Es ist eine vollkommen vernünftige Frage.
Wenn alles, was Sie tun möchten, ist die Elemente in einer Warteschlange erhalten negiert:
var negated = myQueue.Select(x => -x);
foreach(int x in negated) ...
Beachten Sie, dass „negiert“ wird auch weiterhin arbeiten, auch wenn Sie den Inhalt der Warteschlange ändern! Das Abfrageobjekt wird beim Aufzählen und nicht beim Erstellen ausgewertet.
Beachten Sie, dass myQueue
überhaupt nicht geändert wird; negated
ist einfach ein Wrapper um ihn herum, der die Elemente, wie sie aufgelistet sind, negiert.
Queues sind so konzipiert, dass ein Element entweder nur auf die Rückseite der Warteschlange geschrieben (Enqueue) oder von der Vorderseite der Warteschlange gelesen werden kann (peek/dequeue). Das Ändern eines Elements in der Mitte der Warteschlange ist einfach keine definierte Operation. Selbst wenn eine ForEach
Methode existierte, würde dies den Zweck der Datenstruktur zunichte machen.
Es wäre besser, die Elemente zu negieren, während Sie sie in die Warteschlange stellen oder aus der Warteschlange entfernen. Sie könnten eine Erweiterungsmethode schreiben, wenn Sie wirklich wollten, zum Beispiel:
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
}
Wenn Sie wirklich eine Datenstruktur benötigen, die Änderung der Elemente an Ort und Stelle ermöglicht, benötigen Sie eine andere Datenstruktur zu verwenden, z.B. a List<int>
.
'queue.ForEach' wäre eine readonly-Methode und würde sowieso nicht tun, was Sie wollen. (genau wie 'foreach') –
Hmm, nein das sind -100 Punkte für die Verwendung des falschen Sammlungsobjekts. Sehr schwer, das über 0 zu bekommen, wenn du nicht erklärst, warum du denkst, dass du das tun musst. –
Stimmen Sie mit @HansPassant überein, Sie verwenden wahrscheinlich die falsche Sammlung. Was Sie tun würden, ist verschwenderisch und Sie haben herausgefunden, warum es so wäre ... – FirebladeDan