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默 ...
随机推荐
- 李洪强实现横向滚动的View<一>
今天做一个小的view的效果(纯代码),虽然这个view做起来 并不是很难,但是他是为后面我要实现的功能做一个铺垫. 01 创建CFTyreView,继承自UIView 02 来到.m文件. 2.1 ...
- 气死人不偿命,Q_OBJECT导致的C++报错,而且还看不明白(#ifdef没控制好,导致什么都不认识了)
为了代码可以同时适应VC++和MingW编译器,我改动了我的代码,变成: #ifdef _MSC_VER #pragma comment(lib, "crypt32.lib") / ...
- Keepalived+MySQL双主
一.Keepalived+MySQL Replication的应用场景 MySQL的高可用方案有cluster,MMM,MHA等,这些高可用方案都要三台服务器以上,成本有点高,今天介绍一个低成本高可用 ...
- PSTN
PSTN ( Public Switched Telephone Network )定义:公共交换电话网络,一种常用旧式电话系统.即我们日常生活中常用的电话网.工作原理 公共交换电话网络是一种全球语音 ...
- 转载:10个实用的但偏执的Java编程技术
在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的…… 任何事情有可能出错,没错,的确如此. 这就是为什么我们要采用“防御性编程”,即 ...
- Lombok 安装、入门 - 消除冗长的 java 代码(转)
前言: 逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下. lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对于 ...
- Art-Directing SVG图像viewBox属性
Art-Directing SVG图像viewBox属性 作者:彦子 日期:2015-06-02 点击:992 svg 译者注:根据Google Dev文档的解释,Art Direction在这篇文章 ...
- (转)如何正确使用C++多重继承
http://bigasp.com/archives/486 如何正确使用C++多重继承 2011年06月17日 — Asp J 原创文章,转载请注明:转载自Soul Apogee本文链接地址:如何正 ...
- 转载--C++ STL
转自:http://wenku.baidu.com/view/15d18b4533687e21af45a9a4.html 1.C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec ...
- [Jacky] Stoe load reload 区别
load( Object options ) : Boolean 采用配置好的Reader格式去加载Record缓存,具体请求的任务由配置好的Proxy对象完成. reload( Object opt ...