2012-03-25 3 views

Antwort

8

Vielleicht ein List oder ein Array würde für solche Aktionen besser, aber man könnte versuchen, diese:

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

Dies ist eine funktionierende Lösung, aber es ist eher eine Antwort auf die Frage: Wie setze ich eine Warteschlange in eine Liste, damit ich die IndexOf Methode aufrufen kann? –

+1

In der Tat, aber die Warteschlange bieten keine Schnittstelle für die Rückgabe des Index, so ist dies eine Kompromisslösung – ionden

+2

Ich bin in Ordnung, aber das braucht einen zweiten Gedanken, wenn möglich –

-1

Da Sie die Benutzer sind Enqueing, er wird immer die letzte Person in der Liste sein, was bedeutet, es zu queue.Count gleichwertig sein.

+0

nein nein ich bin mit Remote Scripting den aktuellen Standort, alle paar Minzen – baaroz

+0

@baaroz aufzufrischen: Nun, wenn Sie nicht sehen, [etwas hier] (http: // msdn .microsoft.com/de/us/library/7977ey2c.aspx), dann können wir wirklich nicht viel für Sie tun. Sie müssen einen anderen Containertyp auswählen. Imen ist richtig. 'List ' s kann trotzdem wie Warteschlangen verwendet werden. – mpen

0

Wenn Sie dem Benutzer jetzt mitteilen möchten, wie viele Elemente sein Element enthält, geben Sie nach dem Einfügen seiner Elemente einfach die aktuelle Queue .Count -Eigenschaft zurück. Immer wenn Sie ein Element drücken, wird die Anzahl erhöht. Wenn ein Element aufgeklappt wird, wird die Anzahl verringert.

1

Queue nicht der richtige Typ ist IndexOf zu verwenden, suchen Sie nach Liste

+0

Ich weiß, dass es nicht IndexOf! Es war nur ein Beispiel für das, was ich versuche zu tun – baaroz

+0

Was ich meine ist, dass, wenn Sie eine Sammlung brauchen, für die Sie die Position des Elements in diesem wissen müssen Sammlung, dann Warteschlange ist die falsche Wahl. @ionden hat geantwortet, wie es geht, ist der richtige Weg, aber .. –

1

Leider kann man nicht verwende direkt das einfache alte .NET Queue Objekt. Die Warteschlange ist für eine "blinde" First-in-first-out-Logik ausgelegt, so dass Sie nur etwas anderes ausführen können.

Wenn Sie wirklich brauchen eine Warteschlange zu implementieren, in dem Sie Elemente finden können und ihre Position abrufen (eine sehr nützliche Sache) versuchen, in einer Klasse, alles zu wickeln, das die folgenden Methoden aussetzt:

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++; 
     } 
    } 
} 

Für eine bessere Leistung (Warteschlange und dequeue O (1), während indexOf O (n)) mit einer doppelt verkettete Liste

3

Sie können Erweiterungsmethode verwenden, so etwas wie verwenden soll:

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

Verwenden Sie die Methode QueueToArray(), um ein Array in der Reihenfolge der Warteschlange abzurufen, und suchen Sie dann nach dem Objekt, nach dem Sie suchen. Es besteht eine gute Chance, dass Sie für jede Aufgabe, die Sie ausführen, keine traditionelle Warteschlange verwenden müssen.

Etwas wie:

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

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