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);

}

}

}

}

}

时间: 2024-12-19 20:56:52

C#高级编程四十九天----队列的相关文章

C#高级编程六十九天----DLR简介

DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象深刻. C#4动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务,它允许添加动态语言,如Ruby和Python,并使C#具备和这些动态语言相同的某些功能. 动态编程语言并非什么新鲜事物,早在面向对象编程语言成为主流之前,人们

C#高级编程四十六天----正则表达式

正则表达式 1.定义一个Regex类的实例 Regex regex=new Regex(""); 这里初始化参数就是一个正则表达式,"\d"表示配置数字 2.判断是否匹配 判断一个字符串,是否匹配一个正则表达式,在Regex对象中,可以使用Regex.IsMatch(string )方法. Regex regex = new Regex(@"\d"); bool b1=regex.IsMatch("abc"); //返回值为f

C#高级编程五十九天----集合的性能

各种集合的性能 许多集合类提供了相同的功能,例如,SortedList类与SortedDictionary类的功能几乎完全相同.但是,其性能常常有很大的区别.SortedList集合使用的内存少,SortedDictionary集合的元素检索速度快. 在MSDN文档中,集合的方法常常有性能提示,给出了以大O(字母)表示的操作时间: O(1) O(log n) O(n) O(1)表示无论集合中有多少数据项,这个操作需要的时间都不变.例如ArrayList类的Add()方法就具有O(1)行为.无论列

C#高级编程四十天----运算符重载

运算符重载 所谓的运算符重载是指允许用户使用用户定义的类型编写表达式的能力. 例如,通常需要编写类似与以下内容的代码,入江两个数字相加,很明显,sum是两个数字之和. int i=5,j=4; int sum = i+j; 如果可以使用代表附属的用户定义的类型来编写相同类型的表达式,那当然是最好不过的了: Complex i=5; Complex sum=i+j; 运算符重载允许为用户定义的类型重载(即指明明确的含义)诸如"+"这样的运算符.如果不进行重载,则用户需要编写以下代码: C

C#高级编程四十四天-----string和stringbuilder

System.String类 首先string类是静态的,System.String是最常用的字符串操作类,可以帮助开发者完成绝大部分的字符串操作功能,使用方便. 1.比较字符串 比较字符串是指按照字典排序规则,判定两个字符的相对大小.按照点点规则,在一本英文字典中,出现在前面的单词小于出现在后面的单词.在string类中,常用的比较字符串的方法包括Compare,CompareTo,CompareOrdinal以及Equals,下面进行详细的介绍. Compare()方法是string类的静态

PHP 高级编程之多线程-消息队列

Home  |  Mirror  |  Search  |  杂文  |  ITEYE 博客  |  OSChina 博客  |  51CTO 博客  |  Linkedin PHP 高级编程之多线程 http://netkiller.github.io/journal/thread.php.html Mr. Neo Chen (netkiller), 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 +86 755 29812080

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

Lookup类 Dictionary<Tkey,TValue>只为每个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictionary<Tkey,TElement>,但把键映射带一个值集上.这个类在程序及System.Core中实现,用System,Linq命名空间定义. Lookup<Tkey,TElement>的方法和属性如下表: 属性名或者方法名 说明 Count 属性Count返回集合中的元素个数 Ite

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

(一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByRefObject--这是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据. FileSystemInfo--这是表示任何文件系统对象的基类. FileInfo和File--这些类表示文件系统上的文件. DirectoryInfo和Directory--这些类表示文件系统上的文件夹.

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

(一)后台内存管理 1.值数据类型 Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址,该任务由Windows在后台管理(32位每个进程可使用4GB虚拟内存,64位更多,这个内存包括可执行代码和加载的DLL,以及程序运行时使用的变量内容). 在处理器的虚拟内存中,有一个区域称为栈.栈存储不是对象成员的值数据类型. 释放变量时,其顺序总是与它们分配内存的顺序相反,这就是栈的工作方式. 程序第一次运行时,栈指针指向为栈保留的内存块末尾.栈实际上是向下填充的,即从