[转]迭代、集合、字典表和列表
集合在編程的過程中用的是非常的多,如GridViewRowCollection、ConnectionStringSettingsCollection、NameValueCollection等等。一般來說,集合的類都包含在System.Collections命名空間中。那眾多集合之間又有什么樣的聯系呢?這需要我們從集合的集成關系上理順一下。
一、IEnumerable和IEnumerator接口
??? IEnumberable接口是大部分集合類型的根。它是一個支持foreach迭代的接口,一個集合對象要能遍歷所有對象的話,那它必需要實現這個接口,它的聲明結構如下:
??????? public interface IEnumerable
??????? {
??????????? IEnumerator GetEnumerator ();
??????? }
??? 其中的GetEnumerator方法返回的是IEnumerator類型,可以用返回的IEnumerator類型結果實現對集合內容的向前遍歷。
??? IEnumerator接口的聲明如下:
public interface IEnumerator
?????? {
Object Current { get; }???? //獲取集合中的當前元素。
bool MoveNext ();???????????? //如果枚舉成功推進到下一個元素,則為 true;如果枚舉數越過集合的結尾,則為 false。
void Reset () ;??????????????????? //將枚舉數設置為其初始位置,該位置位于集合中第一個元素之前。????
}
??? 如在HashTable中用IEnumerator遍歷數據(關于Hashtable后面會有介紹):
Hashtable h = new Hashtable();
??????? h.Add("a","aaaa");
??????? h.Add("b", "bbbb");
??????? IEnumerator ie = h.GetEnumerator();
??????? while (ie.MoveNext())
??????? {
??????????? Console.Write(((DictionaryEntry)ie.Current).Key + "\t" + ((DictionaryEntry)ie.Current).Value+"\n");
??????? }
二、ICollection接口
??? ICollection接口派生自IEnumerable接口,擴展了集合元素個數和同步功能(對多線程安全訪問的支持)。
??? ICollection接口的聲明:
public interface ICollection : IEnumerable
?????? {
int Count { get; } ???????? //ICollection集合中元素的個數
bool IsSynchronized { get; }?? //獲取是否同步對ICollection 的訪問。
Object SyncRoot { get; }???? //獲取用于同步ICollection訪問的對象。
}?
?????? 所有實現ICollection接口的對象,可以在對集合元素遍歷的時候,把集合鎖定,以防其它線程(用戶)對集合的修改。
ArrayList al = new ArrayList();
??????? al.Add("aaa");
??????? al.Add("bbb");
lock (al.SyncRoot)
??????? {
??????????? for(int i=0;i<al.Count;i++)
??????????? {
??????????????? Console.WriteLine(obj);
??????????? }
??????? }
??? ICollection接口派生了IDictionary和IList兩個子接口。
三、IList接口
??? IList是一個值的集合,派生自ICollection,其成員可以通過索引訪問。如ArrayList
??? IList接口的聲明:
public interface IList : ICollection, IEnumerable
??????? {
??????????? int Add(object value);????? //將某項添加到IList集合中
??????????? void Clear ();????? //從 IList 中移除所有項。
??????????? bool Contains (Object value);??? //確定 IList 是否包含特定值。
??????????? int IndexOf (Object value); //取得IList集合中指定項的索引號。
??????????? void Insert (int index,Object value); //將一個項插入IList集合的指定索引處。
??????????? void Remove(object value);?? //從IList集合中移除指定的項對象。
??????????? void RemoveAt(int index); //從IList集合中移除指定索引項的對象。
??????????? bool IsFixedSize { get; } //指示IList 是否具有固定大小。大小固定的集合在創建之后不允許添加或移除元素,但允許修改現有元素。
??????????? bool IsReadOnly { get; } //IList 是否為只讀。只讀集合在創建之后不允許添加、移除或修改元素。
??????????? Object this [int index] { get; set; } //獲取或設置指定索引號元素的內容。可以使用此索引器實現集合元素的循環遍歷。
}
四、IDictionary接口
??? IDictionary接口實現一個“鍵/值”對的集合,派生自ICollection,可以用循環遍歷其中的每一個元素。其中的每個"鍵/值"對是一個DictionaryEntry 對象,只能用鍵名來存取對象,不能用索引號來存取對象。如HashTable
??? iDictionary接口的聲明:
public interface IDictionary : ICollection, IEnumerable
??????? {
??????????? void Add (Object key,Object value); //在IDictionary集合中添加鍵和值對元素。
??????????? void Clear ();????? //從 IList 中移除所有項。
??????????? bool Contains (Object value);??? //確定 IList 是否包含特定值。
??????????? IDictionaryEnumerator GetEnumerator (); //返回一個用于 IDictionary 集合的 IDictionaryEnumerator 對象。
??????????? void Remove (Object key);???? //從集合中移除指定鍵值的元素
??????????? bool IsFixedSize { get; } //指示IList 是否具有固定大小。大小固定的集合在創建之后不允許添加或移除元素,但允許修改現有元素。
??????????? bool IsReadOnly { get; } //IList 是否為只讀。只讀集合在創建之后不允許添加、移除或修改元素。
?????????? Object this [Object key] { get; set; } //獲取或設置具有指定鍵的元素。
??????????? ICollection Keys { get; } //獲取IDictionary中的所有的鍵集合。
??????????? ICollection Values { get; }?? //獲取IDictionary中的所有的值集合。
??????? }
五、ArrayList類
??? ArrayList類實現了IList接口,用來存儲非泛型對象。
Count屬性:集合中實際元素的個數。
Capacity屬性:ArrayList空間的大小。生成一個ArrayList對象的時候默認分配了4個元素的空間(默認),在添加前4個元素的時候Capacity始終是4。當添加第5個元素的時候,首先框架會把ArrayList的Capacity的容量加倍,然后再把第5個元素存入。
??????? void AddRange (ICollection c):將一個新的ICollection對象加到當前ArrayList后面,通常用來拼接兩個ArrayList。
??????? ArrayList GetRange (int index,int count):從當前的ArrayList對象中返回指定位置和指定數目的元素,并將這些元素以新的ArrayList對象形式返回。
??????? void InsertRange(int index,ICollection c) :在指定的位置插入另一個ICollection對象。
??????? void TrimToSize():將ArrayList的容量縮減到ArrayList的實際的元素個數。
??????? void Reverse() :將數組的順序進行返轉。
??????? void Sort():將數組進行排序。
六、Hashtable類:
??? Hashtable實現了IDictionary接口,可以用來存儲非泛型對象。由于Hashtable實現的是IEnumerable接口,所以可以用foreach對Hashtable進行遍歷。
??????? void ContainsKey(object o)?? //判斷Hashtable 是否包含指定鍵。
??????? void ContainsValue(object o)??? //判斷Hashtable是否包含指定的值。
??????? Hashtable Hashtable.Synchronized (Hashtable t) //靜態方法,將一個普通的Hashtable包裝為一個同步的(線程安全)Hashtable。
??? 用IEnumerator對Hashtable進行顯示:
Hashtable h = new Hashtable();
??????? h.Add("a","aaaa");
??????? h.Add("b", "bbbb");
IEnumerator ie = h.GetEnumerator();
??????? while (ie.MoveNext())
??????? {
??????????? Console.Write(((DictionaryEntry)ie.Current).Key + "\t" + ((DictionaryEntry)ie.Current).Value+"\n");
??????? }
??? 用foreach來實現對Hashtable的迭代顯示:
??? Hashtable h = new Hashtable();
??????? h.Add("a","aaa");
??????? h.Add("b", "bbb");
foreach (DictionaryEntry d in h)
??????? {
??????????? Console.WriteLine(d.Key+"\t"+d.Value);
??????? }
??? 由于Keys和Values也是ICollection集合,所以也要以用foreach分別對Keys和Values集合進行迭代
Hashtable h = new Hashtable();
??????? h.Add("a","aaa");
??????? h.Add("b", "bbb");????
??????? foreach (object var in h.Keys)
??????? {
??????????? Console.WriteLine(var);
??????? }
??????? foreach (object var in h.Values)
??????? {
??????????? Console.WriteLine(var);
??????? }??
七、SortedList類:
??? SortedList與散列表一樣也是一個"鍵/值"對的集合,但它是按照關鍵字進行排序的,其值是可以通過數字索引來處理。??
???????????? object GetKey(int index)://根據索引號來取得指定位置的鍵。
???????????? object GetByIndex(int index)://根據索引號來取得指定位置的值。
???????????? IList GetKeyList()://獲取SortedList中的鍵的集合。
???????????? IList GetValueList()://獲取SortedList中的值的集合。
???????????? object IndexOfKey(object var)://取出SortedList中指定鍵的索引號。
???????????? object IndexOfValue(object var)://取出SortedList中指定值的索引號。
??? 用索引號遍歷SortedList中的每個元素
SortedList h = new SortedList();
??????????? h.Add("a","aaa");
??????????? h.Add("d","ddd");
??????????? h.Add("f", "fff");
??????????? h.Add("e", "eee");
??????????? h.Add("c","ccc");
??????????? h.Add("b", "bbb");????????????
??????????? for (int i = 0; i < h.Count; i++)
??????????? {
??????????????? Console.WriteLine(h.GetByIndex(i)+"\t"+h.GetKey(i));
??????????? }
?????? 從輸出的結果中,我們會發現其中的元素會按照key的順序進行排序的。
?????? GetKeyList()和GetValueList()返回的都是IList類型的數據,所以我們也可以使用foreach對二者的返回結果進行迭代:
SortedList h = new SortedList();
??????????? h.Add("a","aaa");
??????????? h.Add("d","ddd");
??????????? h.Add("f", "fff");
??????????? h.Add("e", "eee");
??????????? h.Add("c","ccc");
??????????? h.Add("b", "bbb");
??????????? foreach (object var in h.GetKeyList())
??????????? {
??????????????? Console.WriteLine(var);
??????????? }
??????????? foreach (object var in h.GetValueList())
??????????? {
??????????????? Console.WriteLine(var);
??????????? }
八、Queue類和Stack類
??? 這兩個類都實現了ICollection接口和IEnumerable接口,但沒有實現IList接口。
??? Queue:隊列,先進先出。
Enqueue(object var):入隊
??????? object Dequeue() :出隊
??????? object Peek():返回隊首的元素,但不移除
?????? 出隊和入隊都分影響Queue對象的元素的個數,即影響其Count屬性。
Queue q = new Queue();
??????????? q.Enqueue("aaa");
??????????? q.Enqueue("bbb");
??????????? q.Enqueue("ccc");
??????????? for (int i = 0; i < 3; i++) //這里用的是i<3而不是i<q.Count,因為Dequeue的過程中會影響q.Count。
??????????? {
??????????????? Console.WriteLine(q.Dequeue());
??????????? }
??? Stack:堆棧,先進后出。
Push(object var): //進棧
??????? object Pop() : //出棧
??????? object Peek(): //返回棧頂元素,但不移除
??????? 入棧和出棧都會影響Stack的元素個數。
Stack s = new Stack();
??????????? s.Push("aaa");
??????????? s.Push("bbb");
??????????? s.Push("ccc");
??????????? for (int i = 0; i < 3; i++) //這里用的是i<3而不是i<s.Count,因為Pop的過程中會影響s.Count。
??????????? {
??????????????? Console.WriteLine(s.Peek());
??????????? }
九、ListDictionary類、HybridDictionary類和StringDictionary類
??? 這三個類都實現了IDictionary接口,屬于System.Collections.Specialized 命名空間。
ListDictionary類對于10個或10個以下集合元素的性能非常高,但對于元素個數很大的集合性能欠佳。
HybridDictonary類在集合較小時,使用 ListDictionary 來實現 IDictionary,然后當集合變大時,切換到 Hashtable。
StringDictonary類是一個鍵和值都是強類型化為字符串的散列表。
??? 這三個類和Hashtable一樣,既可以用foreach進行迭代也可以用IEnumerator進行遍歷。??????
十、StringCollection類
??? 實現了IList接口,System.Collections.Specialized 命名空間。
??? 類似于只包含字符串的、強類型化的ArrayList。可以通過Foreach迭代,通過數字索引訪問。
十一、NameValueCollection類
??? 類似于有序的字符串值和字符串鍵的集合,它并沒實現IDictionary接口。
??????? string[] AllKeys屬性:所有鍵的字符串數組。
??????? bool HasKeys():集合對象中是否包含"鍵/值"對。
??????? string Get(int index/string key):根據索引號或鍵名來取得元素的值。
??????? string GetKey(int index):根據索引號取得鍵名。
?????? 對NameValueCollection集合對象的遍歷:
NameValueCollection nvc = new NameValueCollection();
??????????? nvc.Add("a", "aaa");
??????????? nvc.Add("b","bbb");
??????????? nvc.Add("c","ccc");
??????????? foreach (string s in nvc.AllKeys)
??????????? {
??????????????? Console.WriteLine(nvc[s].ToString());
??????????? }
轉載于:https://www.cnblogs.com/ttltry-air/archive/2011/11/27/2264798.html
總結
以上是生活随笔為你收集整理的[转]迭代、集合、字典表和列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++读取INI文件
- 下一篇: 无法找到或创建字体'SansSerif'