Prima di tutto, concedimi solo che in effetti desidero la funzionalità di un Queue<T>
- FIFO, generalmente solo Enqueue
/Dequeue
, ecc. - e quindi preferirei una risposta diversa da "Quello che vuoi veramente è a List<T>
"(So di RemoveAt
).Esiste un modo migliore per implementare un metodo di rimozione per una coda?
Ad esempio, supponiamo di avere uno Queue<DataPoint> dataToProcess
di punti dati che devono essere elaborati nell'ordine in cui sono arrivati. Poi periodicamente avrebbe senso avere qualche codice come questo:
while (dataToProcess.Count > 0) {
DataPoint pointToProcess = dataToProcess.Dequeue();
ProcessDataPoint(pointToProcess);
}
Ma poi supponiamo, per qualsiasi motivo, si è scoperto che un particolare punto di dati che è stato aggiunto alla coda dovrebbe non essere elaborato. Allora sarebbe l'ideale se ci fosse un metodo analogo a:
dataToProcess.Remove(badPoint);
Capisco che non c'è davvero alcun modo fattibile per avere un metodo Remove
che non comporta una qualche forma di enumerazione; tuttavia, dal momento che un Queue<T>
in realtà non consentono solo a piedi e rimuovere qualche elemento a caso, l'unica soluzione che ho potuto capire era questo:
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;
}
È questo il ridicolo? Certamente lo sembra , ma non riesco a vedere un modo migliore, se non scrivere una classe personalizzata. E anche in quel caso, il modo migliore che potessi pensare per implementare un metodo Remove
sarebbe utilizzare internamente un LinkedList<T>
.
PowerCollections (@codeplex) potrebbe essere utile per voi –