Queue是一種特殊的集合類型,它以FIFO方式(先進(jìn)先出)存儲元素,與Stack <T>集合完全相反。它按添加順序包含元素。C#包括泛型Queue<T>和非泛型Queue集合。建議使用泛型Queue<T>集合。
Queue<T> 是FIFO(先進(jìn)先出)集合。
它在System.Collection.Generic命名空間下。
Queue<T>可以包含指定類型的元素。它提供編譯時類型檢查,并且不執(zhí)行裝箱/拆箱,因為它是泛型的。
可以使用Enqueue()方法添加元素。無法使用集合初始化(collection-initializer)語法。
可以使用Dequeue() 和 Peek()方法檢索元素。它不支持索引器。
下圖說明了Queue集合:
您可以通過為 Queue<T> 其存儲的元素類型指定類型參數(shù)來創(chuàng)建的對象。下面的示例使用 Enqueue ()方法在 Queue <T> 中創(chuàng)建和添加元素。Queue 集合允許 null (用于引用類型)和重復(fù)值。
Queue<int> callerIds = new Queue<int>(); callerIds.Enqueue(1); callerIds.Enqueue(2); callerIds.Enqueue(3); callerIds.Enqueue(4); foreach(var id in callerIds) Console.Write(id); //打印1234
屬性 | 用法 |
---|---|
Count | 返回隊列中元素的總數(shù)。 |
方法 | 用法 |
---|---|
Enqueue(T) | 將項目添加到隊列中。 |
Dequeue | 從隊列的開頭返回一個項目,并將其從隊列中刪除。 |
Peek(T) | 從隊列中返回第一個項目而不將其刪除。 |
Contains(T) | 檢查項目是否在隊列中 |
Clear() | 從隊列中刪除所有項目。 |
Dequeue()和Peek()方法用于檢索在隊列集合中的第一個元素。Dequeue()移除并返回一個隊列中的第一個元素,因為在FIFO的順序隊列存儲元素。在空隊列上調(diào)用 Dequeue() 方法將引發(fā)InvalidOperation異常。因此,在調(diào)用隊列之前,請始終檢查隊列的總數(shù)是否大于零。
Queue<string> strQ = new Queue<string>(); strQ.Enqueue("H"); strQ.Enqueue("e"); strQ.Enqueue("l"); strQ.Enqueue("l"); strQ.Enqueue("o"); Console.WriteLine("元素總數(shù): {0}", strQ.Count); //輸出 5 while (strQ.Count > 0){ Console.WriteLine(strQ.Dequeue()); //輸出 Hello } Console.WriteLine("元素總數(shù): {0}", strQ.Count); //輸出 0
Peek()方法始終從隊列集合中返回第一項,而不會將其從隊列中刪除。Peek()在空隊列上調(diào)用該方法將引發(fā)運行時異常 InvalidOperationException。
Queue<string> strQ = new Queue<string>(); strQ.Enqueue("H"); strQ.Enqueue("e"); strQ.Enqueue("l"); strQ.Enqueue("l"); strQ.Enqueue("o"); Console.WriteLine("元素總數(shù): {0}", strQ.Count); //輸出 5 if(strQ.Count > 0){ Console.WriteLine(strQ.Peek()); //輸出 H Console.WriteLine(strQ.Peek()); //輸出 H } Console.WriteLine("元素總數(shù): {0}", strQ.Count); //輸出 0
Contains()方法檢查隊列中是否存在項目。如果指定的項目存在,則返回true,否則返回false。
Contains() 簽名:
bool Contains(object obj);
Queue<int> callerIds = new Queue<int>(); callerIds.Enqueue(1); callerIds.Enqueue(2); callerIds.Enqueue(3); callerIds.Enqueue(4); callerIds.Contains(2); //true callerIds.Contains(10); //false