2012-03-25 71 views
6

Tengo una cola de usuarios (cadena de correos electrónicos) a en C# y deseo enviar al usuario su ubicación en esta cola.Obtener el índice de un elemento dentro de la cola C#

algo así como;

Queue q = new Queue(32); 

q.Enqueue(Session["email"].ToString()); 

    queue.IndexOf(email); 

¿Alguna idea?

gracias

Respuesta

8

Tal vez un List o un Array sería mejor para este tipo de acciones, pero se podía probar esto:

queue.ToArray().ToList().IndexOf(email); 
+0

Esta es una solución de trabajo, pero es más una respuesta a la pregunta: ¿Cómo poner una cola en una lista para que pueda llamar al método IndexOf? –

+1

De hecho, pero las colas no ofrecen una interfaz para devolver el índice, así que esta es una solución de compromiso – ionden

+2

Estoy de acuerdo con, pero esto necesita una segunda reflexión, si es posible –

-1

Puesto que usted está enqueing el usuario, que siempre será la última persona en la lista, lo que significa que será equivalente a queue.Count.

+0

no no estoy usando secuencias de comandos remoto para actualizar la ubicación actual, cada pocas casas de la moneda – baaroz

+0

@baaroz: Bueno, si usted no ve [algo aquí] (http: // MSDN .microsoft.com/es-us/library/7977ey2c.aspx), entonces realmente no hay mucho que podamos hacer por usted. Debe elegir un tipo de contenedor diferente. ionden tiene razón. 'List ' s se puede usar como colas de todos modos. – mpen

0

si desea que el usuario sepa cuántos elementos contiene su elemento, simplemente devuelva la propiedad .Count de la cola actual, luego de insertar sus elementos. Cada vez que empujas un elemento, el conteo aumenta. Si un elemento aparece, el recuento se reduce.

1

cola no es del tipo adecuado para usar IndexOf, buscar Lista

+0

Sé que no hay IndexOf! Fue solo un ejemplo de lo que estoy tratando de hacer – baaroz

+0

Lo que quiero decir es que si necesita una colección para la que necesita saber la posición del elemento en ese colección, entonces Queue es la elección incorrecta. @ionden respondió cómo hacerlo, es la manera correcta, pero ... –

1

Por desgracia, no se puede utilizar directamente el antiguo objeto .NET Queue. Queue está hecho para lógica "ciega" de "primero en entrar, primero en salir", por lo que no puedes realizar nada más que eso.

Si realmente necesita para implementar una cola en la que se combinan los elementos y recuperar su posición (una cosa muy útil) tratar de envolver todo en una clase que expone los métodos siguientes:

public class CustomQueue<T> { 
    private LinkedList<T> fifoList = new LinkedList<T>(); 

    public Enqueue(T newItem) { 
     //add newItem at the head of fifoList 
    } 

    public T Dequeue() { 
     //return and remove the item that is located at the tail of the queue 
    } 

    public int indexOf(T searchFor) { 
     int ret = 0; 
     for (T item: fifoList) { 
      if (item.equals(searchFor)) return ret; 
      ret++; 
     } 
    } 
} 

Para una mejor rendimiento (cola y quitar de la cola O (1), mientras que indexOf O (n)) se debe utilizar una lista de doble ligado

3

se puede utilizar el método de extensión, algo así como:

public static int IndexOf<T>(this IEnumerable<T> collection, T searchItem) 
{ 
    int index = 0; 

    foreach (var item in collection) 
    { 
     if (EqualityComparer<T>.Default.Equals(item, searchItem)) 
     { 
      return index; 
     } 

     index++; 
    } 

    return -1; 
} 
0

Utilice el método QueueToArray() para obtener una matriz en el orden de la cola, luego encuentre el objeto que está buscando. Sin embargo, es muy probable que no necesite utilizar una cola tradicional para la tarea que esté realizando.

Algo así como:

Queue q = new Queue(); 
q.Enqueue("apple"); 
q.Enqueue("banana"); 
q.Enqueue("orange"); 

// get banana index: 
return Array.IndexOf(q.ToArray(), "banana"); 
Cuestiones relacionadas