2011-11-01 18 views
24

W języku C#, jak mogę sprawdzić, czy kolejka jest pusta?Jak mogę sprawdzić, czy kolejka jest pusta?

Chcę iterować elementy Queue i muszę wiedzieć, kiedy przestać. Jak mogę to zrobić?

+0

Którą kolejkę używasz? proszę opublikować definicję kolejki. –

+0

Co to jest kolejka? Co zawiera? –

+2

wystarczy wywołać funkcję, która mówi, czy jest pusta, czy nie. (odpowiedź bez kodu na pytanie bez kodu) – musefan

Odpowiedz

38

Zakładając, że masz na myśli Queue<T>mógłby wystarczy użyć:

if (queue.Count != 0) 

Ale po co się męczyć? Wystarczy iteracyjne nad nim tak, i jeśli jest pusty nigdy nie przedostają się do organizmu:

Queue<string> queue = new Queue<string>(); 

// It's fine to use foreach... 
foreach (string x in queue) 
{ 
    // We just won't get in here... 
} 
+30

Uwaga: podejście foreach nie działa, jeśli musisz dodać jakiekolwiek elementy do kolejki podczas przetwarzania kolejki (np. jeśli wdrażasz algorytm BFS), ponieważ wtedy moduł wyliczający zostanie unieważniony. Korzystanie z właściwości Count jest właściwą drogą do tego scenariusza. – DSO

+1

@ DSO nie zostałby unieważniony przez moduł wyliczający, jeśli usuwasz elementy z kolejki? – Jakotheshadows

+1

Więc jaki jest sens korzystania z kolejki, jeśli nie usuwasz elementów według Dequeue? – titol

7

Zakładając, że oznaczało System.Collections.Generic.Queue<T>

if(yourQueue.Count != 0) { /* Whatever */ } 

powinno załatwić sprawę.

1

można sprawdzić, czy jego własnością hrabiego równa 0.

3

Istnieje metoda rozszerzenie .Count(), która jest dostępny, ponieważ kolejka implementuje IEnumerable.

Możesz także zrobić _queue.Any(), aby zobaczyć, czy są w nim jakieś elementy.

+2

Drugi jest zły, pierwszy jest okropny. Użyj właściwości queue.Count. –

3
Queue test = new Queue(); 
    if(test.Count > 0){ 
     //queue not empty 
    } 
0

jeśli używasz kolejki (System.Collections.Generic.Queue) następnie

Queue<String> QST; 
... 
int numberOfElement = QST.Count(); 
+4

Użyj Qst.Count - O (1) - nie Qst.Count() - O (n). –

13

Proponuję przy użyciu dowolnej metody(), ponieważ nie zrobi liczyć na całej kolejki, która będzie lepsza pod względem wydajności.

Queue myQueue = new Queue(); 
    if(myQueue.Any()){ 
     //queue not empty 
    } 
+8

@GregoryBad: 'myQueue.Count' nie spowoduje zliczenia całej kolejki. Rozmiar jest przechowywany w prywatnej zmiennej w klasie kolejki, którą właśnie zwraca właściwość Count, patrz [Kolejka . Właściwość .Count] (http://msdn.microsoft.com/en-us/library/fy0wwyz4.aspx). Licznik masz na myśli to Count() w przestrzeni nazw linq. [Enumerable.Count] (http://msdn.microsoft.com/en-us/library/bb338038.aspxt) – Rutix

+0

@Rutix, Dzięki za to. Dobrze wiedzieć. – GregoryBrad

+1

@Rutix Nawet metoda Enumerable.Count() jest zoptymalizowana, aby sprawdzić, czy można ją przesłać do ICollection i zwrócić właściwość .Count bez wyliczania. –

Powiązane problemy