队列,元素是FIFO的方式来处理集合的。队列和集合、StringBuilder这些容量都一样的规则,没有定义容量的时候,添加元素都是容量递增的,成倍增加。其他也没什么特别的了。进队列是Equeue(),出队列是Dequeue()这个例子里关于多线程安全问题我都是是跳过,没研究的,等学到多线程的时候再了解。
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace Sample
{
public class MainEntryPoint
{
static int Main(string[] args)
{
var dm =new DocumentManager();
ProcessDocuments.Start(dm);
for(int i = 0; i < 1000 ; i++)
{
Document doc = new Document("Doc "+i.ToString(),"content");
dm.AddDocument(doc);
Console.WriteLine("Added document {0}", doc.Title);
Thread.Sleep(new Random().Next(20));
}
return 0;
}
}
public class Document
{
public string Title{ get; private set;}
public string Content{ get; private set;}
public Document(string title, string content)
{
this.Title = title;
this.Content = content;
}
}
public class DocumentManager
{
private readonly Queue<Document> documentQueue = new Queue<Document>();
//在队列的队尾添加一个document
public void AddDocument(Document doc)
{
lock(this)
{
documentQueue.Enqueue(doc);
}
}
//在队列的头部取出document
public Document GetDocument()
{
Document doc = null;
lock(this)
{
doc = documentQueue.Dequeue();
}
return doc;
}
//一个标记队列中是否还有document的属性
public bool IsDocumentAvailable
{
get
{
return documentQueue.Count > 0;
}
}
}
public class ProcessDocuments
{
public static void Start(DocumentManager dm)
{
Task.Factory.StartNew(new ProcessDocuments(dm).Run);
}
protected ProcessDocuments(DocumentManager dm)
{
if(dm == null)
throw new ArgumentNullException("dm");
documentManager = dm;
}
private DocumentManager documentManager;
protected void Run()
{
while(true)
{
if(documentManager.IsDocumentAvailable)
{
Document doc = documentManager.GetDocument();
Console.WriteLine("Processing document {0}",doc.Title);
}
Thread.Sleep(new Random().Next(20));
}
}
}
}
栈也是很简单的,LIFO,进栈Push(),出栈Pop()。都和C++里差不多。
using System;
using System.Collections.Generic;
namespace Sample
{
public class MainEntryPoint
{
static int Main(string[] args)
{
Stack<char> alphabet = new Stack<char>();
alphabet.Push('A');
alphabet.Push('B');
alphabet.Push('C');
//第一次只是查看了栈内的全部元素 对栈没有任何的改变
Console.WriteLine("First:");
foreach(char item in alphabet)
{
Console.WriteLine(item);
}
//第二次是出栈一个输出一个 等循环结束的时候 栈为空
Console.WriteLine("Second:");
while(alphabet.Count > 0)
{
char x = alphabet.Pop();
Console.WriteLine(x);
}
return 0;
}
}
}