Queue队列
你存的元素改为KeyValuePair或自定义的Key-Value对的类即可
命名空间: System.Collections
Code
using System;
using System.Collections;
public class SamplesQueue {
public static void Main() {
// Creates and initializes a new Queue.
Queue myQ = new Queue();
myQ.Enqueue("Hello");
myQ.Enqueue("World");
myQ.Enqueue("!");
// Displays the properties and values of the Queue.
Console.WriteLine( "myQ" );
Console.WriteLine( "\tCount: {0}", myQ.Count );
Console.Write( "\tValues:" );
PrintValues( myQ );
}
public static void PrintValues( IEnumerable myCollection ) {
foreach ( Object obj in myCollection )
Console.Write( " {0}", obj );
Console.WriteLine();
}
}
/*
This code produces the following output.
myQ
Count: 3
Values: Hello World !
*/
遍历出来的顺序与Add的顺序是一致的
先进先出(FIFO, First in first out),明显该用队列,你就封装个类存进Queue好了,或者就直接存KeyValuePair吧
最好的选择是写个类,内部包含一个KeyValuePair的队列或者List,再包含一个Dictionary,这种情况下可以得到获取为O(1)的复杂度以及先进先出的遍历
List<Pair> list = new List<Pair>();
Pair p = new Pair(key, value);//不能监视 key 的唯一性,如果有对 key 唯一性的追求,那么该用 Dictionary<object, object>
foreach(Pair p in list){
//original order
}
Dictionary<object, object> dic = new Dictionary<object, object>();//保证 key 唯一,并且可以随即快速索引某 key 的对应值
List<object> oriOrder = new List<object>();//原始序列
//for adding
if(!dic.ContainsKey(key)){
dic.Add(key, value);
oriOrder.Add(key);
}
//for enumerator
foreach(object key in oriOrder){
//key
object value = dic[key];
}
张大侠的意思大概是把上面的包装成某一个 QueueableDictionary, 继承 Dictionary<T, K> 以及重载 IEnumerator 接口的方法.
可以将扩充hashtable来实现楼主的这个要求。
思路:重写hashtable的Add,clear,remove方法,等,用ArrayList来添加它的key(ArrayList存在先进先出特性)。代码如何下:
Code