程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#高級編程四十九天----隊列

C#高級編程四十九天----隊列

編輯:C#基礎知識

隊列

1.Queue定義

System.Collections.Queue類表示對象的先進先出集合,存儲在Queue(隊列)中的對象在一端插入,從還有一端移除.

 

2.長處

(1).能對集合進行順序處理(先進先出)

(2)能接受null值,而且同意反復的元素

 

3.Queue的構造器

構造器函數

凝視

Queue()

初始化Queue類的新實例,該實例為空,具有默認初始容量(32)並使用默認增長因子(2.0)

Queue(ICollection)

初始化Queue類的新實例,該實例包括從指定集合復制的元素,具有與所復制的元素數同樣的初始容量並使用默認增長因子

Queue(Int32)

初始化Queue類的新實例,該實例為空,具有指定的初始容量並使用默認增長因子

Queue(Int32,single)

初始化Queue類的新實例,該實例為空,具有指定的初始容量並使用指定的增長因子

 

 

4.Queue屬性

屬性名

凝視

Count

獲取Queue中包括的元素數

 

 

5.Queue的方法

方法名

凝視

void Clear()

從Queue中移除全部對象

bool Contains(object obj)

確定某元素是否在Queue中

object Clone()

創建Queue的淺表副本

void CopyTo(Array array,int index)

從指定數組索引開始講Queue元素拷貝到現有的以為Array中

object Dequeue()

移除並返回位於Queue開始處的對象

void Enqueue()

將對象加入到Queue的結尾處

object Peek()

返回位於Queue開始處的對象但不將其移除

object[]ToArray()

將Queue元素拷貝到新的數組

void TrimToSize()

將容量設置為Queue中元素的實際數目

 

 

 

6.Queue的使用案例

 

using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace 隊列

{

    class Program

    {

        static void Main(string[] args)

        {

            //創建一個隊列

            Queue myQ = new Queue();

            myQ.Enqueue("The");//入隊

            myQ.Enqueue("quick");

            myQ.Enqueue("brown");

            myQ.Enqueue("fox");

            myQ.Enqueue(null);//加入null

            myQ.Enqueue("fox");//加入反復元素;

 

            //打印隊列的數量和值

            Console.WriteLine("myQ");

            Console.WriteLine("\tCount:     {0}",myQ.Count);

 

            //打印隊列中的全部值

            Console.WriteLine("Queue Values");

            PrintValues(myQ);

 

            //打印隊列中的第一個元素,並移除

            Console.WriteLine("(Dequeue\t{0})", myQ.Dequeue()); 

 

            //打印隊列中的全部值

            Console.WriteLine("Queue Values");

            PrintValues(myQ);

 

            //打印隊列中的第一個元素

            Console.WriteLine("(Peek)   \t{0}",myQ.Peek());

 

            //打印隊列中的全部值

            Console.WriteLine("Queue Values");

            PrintValues(myQ);

 

            Console.ReadKey();

        }

        public static void PrintValues(IEnumerable myCollection)

        {

            foreach (object item in myCollection)

            {

                Console.WriteLine("    {0}",item);

            }

            Console.WriteLine();

        }

    }

}

 

 

7.備注

(1)Queue的容量是Queue能夠保存的元素數.Queue的默認初始容量是32.箱Queue加入元素時,將通過又一次分配來依據須要自己主動增大容量.可通過調用TrimToSize來降低容量.等比因子是當須要更大容量時當前容量要乘以的數字.在狗仔Queue時確定增長因子.默認增長因子為2.0.

(2)Queue能接受空引用作為有效值,而且同意反復的元素.

(3)空引用能夠作為值加入到Queue.若要區分空值和Queue結尾,請檢查Count屬性或捕捉Queue為空時引發的InvalidOperationException異常.

 

 

案例:配合線程

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

/*

* 元素以先進先出的方式來處理的集合,第一個來,第一個走

* 比如:飛機登記排隊,靠前的就先上飛機,只是隊列有優先級

* 如同經濟艙和商務艙的隊,是兩個不同的隊,而商務艙優先

* 在.NEt技術中,using System.Collections.Generic.Queue<T>

* 是隊列的泛型版本號實現

* System.Collections.Queue是非泛型的實現,參數是object

* public class Queue<T>:IEnumerable<T>,ICollection,IEnumerable

* 從隊列的定義能夠看出,它實現了迭代,集合接口,他沒有實現ICollection<T>這個接口,由於

* 當中定義的Add Remove方法會破壞隊列

* 隊列與列表的主要差別就是,隊列沒有實現IList接口

* 所以,不能夠用索引器訪問隊列,隊列僅僅同意加入元素,

* 該元素僅僅能放在隊列的最後(Enqueue()),還有就是從頭部去元素Dequeue()

* Enqueue從隊列的後面插入元素,而Dequeue在取一個元素的同一時候,

* 會先將取出的元素刪除,如再調用一次,就刪除下一個元素

* 案例:使用一個線程將文檔加入到隊列中,

* 用還有一個線程讀取隊列

* 存儲隊列的類型是Document,我們先定義了一個文檔類

* 接著定義一個文檔處理類DocumentManager,

* 當中包括了加入與讀取方法,另一個屬性確定隊列是不是為空

* 然後我們定義一個ProcessDocuments來處理線程,操作文檔

*/

namespace 隊列和線程

{

    class Program

    {

        static void Main(string[] args)

        {

            DocumentManager mg = new DocumentManager();

            ProcessDocuments process = new ProcessDocuments(mg);

 

            //啟動讀取線程,只是如今沒有內容,要等一會增加後,就能讀到了

            ProcessDocuments.Start(mg);

 

            Document doc = null;

 

            for (int i = 0; i < 500; i++)

            {

                doc = new Document("syx : " + i, "hello,I love You");

                mg.AddDocument(doc);

                //睡會,讓給其它線程玩

                Thread.Sleep(20);

            }

            Console.ReadKey();

        }

 

    }

    /// <summary>

    /// 文檔類,描寫敘述類文檔的標題與內容

    /// </summary>

    public class Document

    {

        public string title;

        public string content;

 

        public Document(string title, string content)

        {

            this.title = title;

            this.content = content;

 

        }

    }

    public class DocumentManager

    {

        //定義隊列集合

        private readonly Queue<Document> docQueue = new Queue<Document>();

 

        //加入文檔

        public void AddDocument(Document doc)

        {

            //從隊列一端插入內容

            docQueue.Enqueue(doc);

            Console.WriteLine("成功插入文檔: {0} ",doc.title);

        }

 

        //讀取文檔

        public Document GetDocument()

        {

            Document doc = null;

            lock (this)

            {

                doc = docQueue.Dequeue();

                return doc;

            }

        }

 

        //僅僅讀屬性,確定隊列中是不是還有元素

        public bool IsDocumentAvailable

        {

            get { return docQueue.Count > 0; }

        }

    }

 

    //處理文檔類

    public class ProcessDocuments

    {

        private DocumentManager dm;

        public ProcessDocuments(DocumentManager dm)

        {

            this.dm = dm;

        }

 

        public static void Start(DocumentManager manager)

        {

            //參數:public delegate void ThreadStart();

            new Thread(new ProcessDocuments(manager).DoThreadFunc).Start();

        }

 

        public void DoThreadFunc()

        {

            while (true)

            {

                if (this.dm.IsDocumentAvailable)

                {

                    Document doc = this.dm.GetDocument();

                    Console.WriteLine("從隊列中讀到讀取並刪除文檔 標題:{0}   內容: {1}", doc.title, doc.content);

                }

            }

        }

    }

}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved