¿Hay una mejor manera de implementar un método Quitar para una cola?
En primer lugar, solo concedo que, de hecho, quiero la funcionalidad de unQueue<T>
- FIFO, generalmente solo necesito.Enqueue
/Dequeue
, etc. - y entonces preferiría una respuesta que no sea "Lo que realmente quieres es unaList<T>
" (Se acerca deRemoveAt
).
Por ejemplo, digamos que tengo unQueue<DataPoint> dataToProcess
de los puntos de datos que deben procesarse en el orden en que llegaron. Luego periódicamente tendría sentido tener un código como este:
while (dataToProcess.Count > 0) {
DataPoint pointToProcess = dataToProcess.Dequeue();
ProcessDataPoint(pointToProcess);
}
Pero supongamos que, por cualquier motivo, se descubre que un punto de datos particular que se ha agregado a la cola deberíano estar procesado. Entonces sería ideal si hubiera un método análogo a:
dataToProcess.Remove(badPoint);
Entiendo que realmente no hay manera posible de tener unaRemove
Método que no involucra alguna forma de enumeración; sin embargo, desde unQueue<T>
realmente no te deja entrar y eliminar algún elemento al azar, la única solución que pude averiguar fue esta:
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;
}
¿Es esto ridículo? Ciertamentemiradas malo, pero realmente no puedo ver una mejor manera, aparte de escribir una clase personalizada. E incluso así, la mejor manera en que podría pensar para implementar unRemove
método sería utilizar unLinkedList<T>
internamente.