2009-08-20 11 views
7

Digamos que tengo una colección de valores en la que especifico el tamaño de la colección y cada vez que se agrega un nuevo valor, se dejan los valores anteriores más allá de este tamaño especificado. Obviamente (y he probado esto) el mejor tipo de recogida a utilizar para este comportamiento es una cola:¿Cómo obtendría el primer y el último artículo en una cola?

myQueue.Enqueue(newValue) 
If myQueue.Count > specifiedSize Then myQueue.Dequeue() 

Sin embargo, lo que si quiero calcular la diferencia entre el primer y último elementos de la cola? Obviamente no puedo acceder a los elementos por índice. Pero cambiar de una cola a algo implementando IList parece exagerado, al igual que escribir una nueva clase similar a una cola. En este momento tengo:

Dim firstValue As Integer = myQueue.Peek() 
Dim lastValue As Integer = myQueue.ToArray()(myQueue.Count - 1) 
Dim diff As Integer = lastValue - firstValue 

esa llamada a ToArray() me molesta, pero una alternativa superior no viene a mí. ¿Alguna sugerencia?

+0

¿C no tiene un tipo Dequeue? –

+0

No, C# no tiene ningún tipo, .Net es lo que tiene tipos; y .Net no tiene un tipo Dequeue, tiene un tipo Queue/Queue que tiene un método Dequeue. –

Respuesta

14

Una cosa que podría hacer es tener una variable temporal que almacena el valor que acaba de poner en cola porque será el último valor y para que se pueda acceder a la variable para obtener ese valor.

+0

Casi al mismo tiempo que proporcionaste esta respuesta, me di cuenta de cuán simple sería la solución (básicamente lo que has sugerido). ¡Buena llamada! –

+0

Gracias. Me alegro de poder dar una buena sugerencia. – murgatroid99

2

Su mejor opción sería realizar un seguimiento del último valor agregado al Queue, luego use la función myQueue.Peek() para ver el elemento "primero" (es decir, el siguiente) de la lista sin quitarlo.

1

Usted podría utilizar un deque (d ouble- e nded cola de).

No creo que haya una integrada en System.Collections (.Generic) pero aquí hay algo de información sobre la estructura de datos. Si implementó algo así, podría usar PeekLeft() y PeekRight() para obtener los primeros y últimos valores.

Por supuesto, le corresponderá si la implementación de su propia deque es preferible o no a la falta de veracidad de ToArray(). :)

http://www.codeproject.com/KB/recipes/deque.aspx

10

Me parece que si necesita un rápido acceso al primer elemento de la lista, entonces usted está utilizando la estructura de datos incorrecto. Cambie una LinkedList en su lugar, que convenientemente tiene propiedades First y Last.

Asegúrese de agregar y eliminar elementos únicamente a la lista vinculada usando AddLast y RemoveFirst para mantener la propiedad Queue. Para evitar infringir involuntariamente la propiedad Queue, considere crear una clase contenedora alrededor de la lista vinculada y exponer solo las propiedades que necesita de su cola.

+0

Desafortunado, pero es mejor que seguir el último agregado fuera de la propia estructura de datos. –

4
public class LastQ<T> : Queue<T> 
{ 
    public T Last { get; private set; } 

    public new void Enqueue(T item) 
    { 
     Last = item; 
     base.Enqueue(item); 
    } 
} 

Editar: Obviamente esta clase básica es más robusto para hacer cosas como proteger a la última propiedad en una cola vacía. Pero esto debería ser suficiente para la idea básica.

+0

¡Ja! Esto es casi VERBATIM el código que acabo de escribir.(La única diferencia es el nombre de la clase y puse Last = item after base.Enqueue (item)). –

+0

¿Qué sucede cuando se elimina el último elemento? Entonces, ¿cómo establecerías 'Last' en el segundo elemento? – nawfal

Cuestiones relacionadas