C#高级编程四十九天----队列

Posted lcchuguo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

                }

            }

        }

    }

}


以上是关于C#高级编程四十九天----队列的主要内容,如果未能解决你的问题,请参考以下文章

《C#高级编程》读书笔记

C#高级编程

读《C#高级编程》第1章

快速理解C#高级概念 Delegate委托

《C#高级编程》学习笔记

《C#高级编程》读书笔记