Zunächst einmal, nur zu gewähren, dass ich in der Tat die Funktionalität eines Queue<T>
- FIFO, in der Regel nur brauchen Enqueue
/Dequeue
, etc. - und so würde ich lieber eine andere Antwort als "Was Sie wirklich wollen a List<T>
"(Ich weiß über RemoveAt
).Gibt es eine bessere Möglichkeit, eine Remove-Methode für eine Warteschlange zu implementieren?
Zum Beispiel sagen, ich habe eine Queue<DataPoint> dataToProcess
von Datenpunkten, die in der Reihenfolge verarbeitet werden müssen, in der sie angekommen sind. Dann regelmäßig wäre es sinnvoll, einige Code wie diese haben:
while (dataToProcess.Count > 0) {
DataPoint pointToProcess = dataToProcess.Dequeue();
ProcessDataPoint(pointToProcess);
}
Aber dann nehme an, für welchen Gründen auch immer, es wird festgestellt, dass ein bestimmter Datenpunkt, der mit der Warteschlange hinzugefügt wurde, sollte nicht verarbeitet werden. Dann wäre es ideal, wenn es eine Methode, ist analog zu:
dataToProcess.Remove(badPoint);
Ich verstehe, dass es wirklich kein gangbarer Weg eine Remove
Methode zu haben, die nicht in irgendeiner Form Aufzählung mit sich bringt; Da jedoch ein Queue<T>
nicht wirklich lassen Sie nur in zu Fuß und einige Artikel zufällig entfernen, die einzige Lösung, die ich herausfinden konnte, war dies:
bool Remove(T item) {
bool itemFound = false;
// set up a temporary queue to take items out
// one by one
Queue<T> receivingQueue = new Queue<T>();
// move all non-matching items out into the
// temporary queue
while (this.Count > 0) {
T next = this.Dequeue();
if (next.Equals(item)) {
itemFound = true;
} else {
receivingQueue.Enqueue(next);
}
}
// return the items back into the original
// queue
while (receivingQueue.Count > 0) {
this.Enqueue(receivingQueue.Dequeue());
}
return itemFound;
}
dies lächerlich ist? Es sicherlich sieht schlecht aus, aber ich kann nicht wirklich einen besseren Weg sehen, als eine benutzerdefinierte Klasse zu schreiben. Und selbst dann wäre der beste Weg, den ich denken könnte, um eine Methode zu implementieren, eine interne LinkedList<T>
zu verwenden.
PowerCollections (@codeplex) könnte nützlich sein für Sie –