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#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic
DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...
- 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数
孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 不同类型 ...
- C++面向对象高级编程(四)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...
- C#高级编程五十四天----Lookup类和有序字典
Lookup类 Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictio ...
- 【读书笔记】C#高级编程 第二十四章 文件和注册表操作
(一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByR ...
- 【读书笔记】C#高级编程 第十四章 内存管理和指针
(一)后台内存管理 1.值数据类型 Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址,该任务由Windows在后台管理(32位每个进程可使用4GB虚拟内存,64 ...
- UNIX环境高级编程——system V消息队列
unix早期通信机制中的信号能够传送的信息量有限,管道则只能传送无格式字节流,这远远是不够的. 消息队列(也叫报文队列)客服了这些缺点: 消息队列就是一个消息的链表. 可以把消 ...
- 【读书笔记】C#高级编程 第十九章 程序集
(一)程序集的含义 程序集是.NET用于部署和配置单元的术语. .NET应用程序包含一个或多个程序集.通常扩展名是EXE或DLL的.NET可执行程序称为程序集. 程序集是自我描述的安装单元,由一个或多 ...
- 第四十九天 mysql 索引 元类
一 昨日回顾 视图 触发器 事务 什么是事务 逻辑上的一组操作 要么都成功 要么都失败 如何使用 start transaction 开启事务 mysql 默认一条sql就是一个事务 pymysql默 ...
随机推荐
- 商务部公开微软持有的Android技术专利
微软与众多Android厂商签署了专利授权协议,但从来没有公开它持有多少项Android技术专利.出人意料的是,为了收购诺基亚手机业务,微软今年4月递交到中国商务部的文件中完整公开了它的Android ...
- c++模板实现抽象工厂
类似于rime的rime::Class<factory type, product type>实现方式. C++模板实现的通用工厂方法模式 1.工厂方法(Factory Method)模式 ...
- Unity NGUI 图集Atlas制作
unity版本:4.5 NGUI版本:3.6.5 1.选择要制作的图片放到对应目录下,在Asset下新建一个文件夹Picture用于放置图片: 2.选中一张图片,打开Atlas Maker: 3.单击 ...
- URI Scheme
1. 什么是URI Scheme? 一般情况下,遇到这种概念不清的问题,最好的第一手资料就是wiki,实在看不懂,再看百度百科,但前者给出的资料一般都是更加准确一些. 以下为维基百科和百度百科关于这个 ...
- 使用 Azure Site Recovery 灾难恢复至 Azure 的功能现已正式发布
ABHISHEK A. HEMRAJANI 云 + Enterprise项目经理 自我们宣布发布使用 Azure SiteRecovery 灾难恢复至 Azure的功能预览版以来,这几个月着实令人 ...
- js制作圆角按钮(兼容谷歌,ie7,ie8)
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- sharepoint 2010 隐藏左边菜单left menu样式脚本
转:http://www.cfanz.cn/?c=article&a=read&id=60536 在v4.master中,<head></head>标签中,加入 ...
- windows查看服务端口
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...
- [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自FilterAttribute类同时实现IAction ...
- Jmeter初步使用三--使用jmeter自身录制脚本
今日,小编在网上看到很多人使用badboy来录制,然后再把jmx脚本弄到Jmeter上做性能测试.这种方法在小编刚用Jmeter时也曾经用过,但是感觉太麻烦了,所以就找了下其它资料.结果,小编偶然发现 ...