2009-10-30 26 views
7

En C# utilizo una colección de cola. Puedo Enqueue o Dequeue fácilmente. De acuerdo, ahora me gustaría insertar algo en el medio de la cola o al principio de la cola. No encuentro ningún método para hacer tal cosa. ¿Qué recomiendas como la colección alternativa?Cómo puedo insertar elementos en una cola en C#

+4

...no me digas, ¿eres uno de esos tipos que intentan entrar en una cola en el medio en el supermercado también? :) Mi punto es que todo el punto de una cola es que los elementos ingresen en un extremo y salgan en otro. Ahora, lo dejaré como un ejercicio para que el lector descubra cómo se puede implementar la gente dejando la cola :) –

Respuesta

26

Una cola, por definición, es algo a lo que solo puede poner en cola y dequeue cosas. Si desea insertar en el medio, desea una lista completa (probablemente LinkedList<T>), no un Queue.

Quiero decir, no intentarás "insertarte" en medio de la cola en un supermercado (espero); funciona de la misma manera aquí.

1

Probablemente tengas que usar una lista.

15

Lo que estás buscando es un LinkedList<T>. Puede agregar al comienzo, al centro (usando AddBefore o AddAfter) o al final de la lista.

Esto es ventajoso sobre el uso de List<T> porque puede usar RemoveFirst o RemoveLast para imitar más de cerca una cola o una pila.

2

El objetivo de una cola es proporcionar una abstracción de interfaz FIFO (primero en entrar, primero en salir). Si desea poder interactuar con su estructura de datos de una manera que no esté en cola, no use una cola.

4

Si bien las respuestas en esta página son correctas si te encuentras en una posición en la que no puedes usar otra cosa que no sea una cola, puedes (con un poco de sobrecarga) agregar un elemento en el medio de una cola. Si debe hacerse o no, es una historia diferente.

var myQueue = new Queue<string>(); 
myQueue.Enqueue("item 0"); 
myQueue.Enqueue("item 10"); 

var myList = myQueue.ToList(); 
myList.Insert(1, "item 5"); 

myQueue = new Queue<string>(myList); 
+1

Técnica útil. Tenga en cuenta que debido a que está creando una nueva 'Cola ', ¡cualquiera que tenga una referencia a la cola anterior no verá su inserción! A veces está bien, si la vieja cola se pasa "por referencia" Y nadie más ha "escondido" una referencia a la cola anterior. El último requisito es el problema: si no puede cambiar la clase que está utilizando, probablemente tampoco tenga la garantía de poder hacer un objeto nuevo. En tal caso, es necesario Decaducir todos los elementos en su lista temporal, insertarlos, y luego Encuéntrarlos nuevamente. – ToolmakerSteve

0

Si desea insertar en "medio" de una cola, se podría estar buscando una "cola de prioridad".

Desafortunadamente, esa no es una clase incorporada .Net, AFAIK. Pero al menos ahora tienes un nombre de concepto, para buscar.

ver este Q (cerrado) & A para algunos posibles enlaces útiles:
Priority queue in .Net

Citando de la cuestión no:

colas de prioridad son estructuras de datos que proporcionan más flexibilidad que la simple clasificación, porque permiten que nuevos elementos ingresen a un sistema a intervalos arbitrarios. Es mucho más rentable insertar un nuevo trabajo en una cola de prioridad que volver a ordenar todo en cada llegada.

La cola de prioridad básica admite tres operaciones principales:

  • Insertar (Q, X). Dado un elemento x con la clave k, insértelo en la cola de prioridad Q.
  • Buscar-Mínimo (Q). Devuelve un puntero al elemento cuyo valor de clave es más pequeño que cualquier otra clave en la cola de prioridad Q.
  • Eliminar-Mínimo (Q). Eliminar el elemento de la cola de prioridad Q cuya clave es mínima
Cuestiones relacionadas