队列

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#高级编程四十九天----队列的更多相关文章

  1. C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic

    DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...

  2. 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数

    孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 不同类型 ...

  3. C++面向对象高级编程(四)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...

  4. C#高级编程五十四天----Lookup类和有序字典

    Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...

  5. 【读书笔记】C#高级编程 第二十四章 文件和注册表操作

    (一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByR ...

  6. 【读书笔记】C#高级编程 第十四章 内存管理和指针

    (一)后台内存管理 1.值数据类型 Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址,该任务由Windows在后台管理(32位每个进程可使用4GB虚拟内存,64 ...

  7. UNIX环境高级编程——system V消息队列

    unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的.     消息队列(也叫报文队列)客服了这些缺点:     消息队列就是一个消息的链表.     可以把消 ...

  8. 【读书笔记】C#高级编程 第十九章 程序集

    (一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多 ...

  9. 第四十九天 mysql 索引 元类

    一 昨日回顾 视图 触发器 事务 什么是事务 逻辑上的一组操作 要么都成功 要么都失败 如何使用 start transaction 开启事务 mysql 默认一条sql就是一个事务 pymysql默 ...

随机推荐

  1. 商务部公开微软持有的Android技术专利

    微软与众多Android厂商签署了专利授权协议,但从来没有公开它持有多少项Android技术专利.出人意料的是,为了收购诺基亚手机业务,微软今年4月递交到中国商务部的文件中完整公开了它的Android ...

  2. c++模板实现抽象工厂

    类似于rime的rime::Class<factory type, product type>实现方式. C++模板实现的通用工厂方法模式 1.工厂方法(Factory Method)模式 ...

  3. Unity NGUI 图集Atlas制作

    unity版本:4.5 NGUI版本:3.6.5 1.选择要制作的图片放到对应目录下,在Asset下新建一个文件夹Picture用于放置图片: 2.选中一张图片,打开Atlas Maker: 3.单击 ...

  4. URI Scheme

    1. 什么是URI Scheme? 一般情况下,遇到这种概念不清的问题,最好的第一手资料就是wiki,实在看不懂,再看百度百科,但前者给出的资料一般都是更加准确一些. 以下为维基百科和百度百科关于这个 ...

  5. 使用 Azure Site Recovery 灾难恢复至 Azure 的功能现已正式发布

    ABHISHEK A. HEMRAJANI 云 + Enterprise项目经理 自我们宣布发布使用 Azure SiteRecovery 灾难恢复至 Azure的功能预览版以来,这几个月着实令人 ...

  6. js制作圆角按钮(兼容谷歌,ie7,ie8)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. sharepoint 2010 隐藏左边菜单left menu样式脚本

    转:http://www.cfanz.cn/?c=article&a=read&id=60536 在v4.master中,<head></head>标签中,加入 ...

  8. windows查看服务端口

    开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...

  9. [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

    前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自FilterAttribute类同时实现IAction ...

  10. Jmeter初步使用三--使用jmeter自身录制脚本

    今日,小编在网上看到很多人使用badboy来录制,然后再把jmx脚本弄到Jmeter上做性能测试.这种方法在小编刚用Jmeter时也曾经用过,但是感觉太麻烦了,所以就找了下其它资料.结果,小编偶然发现 ...