程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#語言各種集合介紹

C#語言各種集合介紹

編輯:C#入門知識

集合,表示可以通過遍歷每個元素來訪問的一組對象(特別是可使用foreach循環訪問)
一個集合包括多個元素,即有一個集合類對象和N個元素對象

因為任何集合類都實現了IEnumerable接口,所以任何集合類對象都有一個GetEnumerator()方法,該方法可以返回一個實現了 IEnumerator接口的對象,這個返回的IEnumerator對象既不是集合類對象,也不是集合的元素類對象,它是一個獨立的類對象。通過這個對象,可以遍歷訪問集合類對象中的每一個元素對象

如果集合類是用戶自定義的集合類,則用戶必須實現它的GetEnumerator()方法,否則不能使用循環。當然,與這個自定義集合類對應的IEnumerator類(實現了該接口的類),也要自定義一個才行

比如,ArrayList集合類對應的IEnumerator是 ArrayListEnumeratorSimple
            Array集合類對應的IEnumerator是 SZArrayEnumerator
      (這兩個類在.net framework類庫文檔(msdn)中都沒有介紹)

1.System.Colloctions中表示集合的行為的接口有:
1)ICollection
定義所有集合的大小、枚舉數和同步方法。派生於IEnumerable
它定義了集合類最基本的行為,所有的集合類都實現了這個接口(基接口)
但是它的行為太過基本:主要就是一個Count屬性,單獨實現它沒有太大意義

2)IEnumerable
公開枚舉數,該枚舉數支持在集合上進行簡單迭代
它只有一個方法 GetEnumerator(),該方法可以返回一個IEnumerator接口,通過它可以遍歷集合
基本上所有的集合類都實現了這個接口

3)IList
IList實現是可排序且可按照索引訪問其成員的值的集合,它本身實現了ICollection和IEnumerable接口
是所有列表的抽象基類。IList 實現有三種類別:只讀、固定大小、可變大小。

4)IDictionary
IDictionary實現是鍵/值對的集合,它本身實現了ICollection和IEnumerable接口
是鍵/值對的集合的基接口。IDictionary 實現有三種類別:只讀、固定大小、可變大小。
IDictionary可稱為字典、映射或散列表,它根據鍵(任意類型)來訪問值


2.System.Collections中可以直接使用的集合類有:
1)ArrayList
實現了接口:IList、ICollection、IEnumerable
只要集合未被修改,ArrayList 就可安全地同時支持多個讀取器
隨著向 ArrayList 中添加元素,容量通過重新分配按需自動增加(2倍增加)
如果需要建立一個對象數組,但不能預先知道數組的大小,就可以使用ArrayList
ArrayList把所有元素都當作object對象引用,因而在訪問ArrayList的元素時要進行類型轉換
優點:動態改變大小、靈活方便的插入和刪除元素、可排序
缺點:插入時性能不如數組、不是強類型的

2)BitArray
實現了接口:ICollection、IEnumerable
管理位值的壓縮數組。

3)Hashtable
實現了接口:IDictionary、ICollection、IEnumerable
可以向Hashtable中自由添加和刪除元素,有些像ArrayList,但沒有那麼大的性能開銷

4)SortedList
實現了接口:IDictionary、ICollection、IEnumerable
SortedLIst兼顧了ArrayList和Hashtable的優點,可按鍵值來排序

5)Queue
實現了接口:ICollection、IEnumerable
Queque是隊列,先進先出的訪問各個元素
可以調用Queque對象的GetEnumerator()方法,得到IEnumerator對象,來遍歷隊列中的各個元素

6)Stack
實現了接口:ICollection、IEnumerable
Stack是堆棧,後進先出的訪問各個元素
可以調用Stack對象的GetEnumerator()方法,得到IEnumerator對象,來遍歷堆棧中的各個元素


3.上面提到的幾種集合類,他們都是通用的集合類,他們所接受的元素大都是Object類型,當對象放入
了集合之後,都失去了原有的類型信息-即這些通用集合類都不是強類型的
解決辦法是使用強類型的集合類
System.Collections命名空間下的CollectionBase,DictionaryBase,ReadOnlyCollectionBase 類
System.Collections.Specialized命名空間下的一些類可以滿足要求,可以直接使用也可以繼承

 

4.集合性能

許多集合類都提供了相同的功能,例如,SortedList與SortedDictionary的功能幾乎完全相同。但是,其性能常常有很大區別。一個集合使用的內存少,另一個集合的元素檢索速度快。在MSDN文檔中,集合的方法常常有性能提示:O(1),時間與操作項時間一致。O(log n)

隨集合中元素的增加而增加,每個元素需要增加的時間不是線性的,而是呈對數曲線。

集合                   Add                    Insert          Remove          Item           Sort                   Find

List<T>   如果集合必須重置大小        O(n)              O(n)             O(1)       O(n log n),            O(n)

              ,就是O(1)或O(n)                                                                    最壞情況O(n^2)

Stack<T>Push(),如果窄必須重置                        Pop(),O(1)

               大小 ,就是O(1)或O(n)

Queue<T>Enqueue(),如果隊列必須                    Dequeue(),   

               重置大小,就是O(1)或O(n)                     O(1)

HashSet<T>如果集必須重置大小,   Add()             O(1)                  

                就是O(1)或O(n)             O(1)或O(n)

LinkedList<T>AddLast()               AddAfter()      O(1)                                                        O(n)

Dictionary      O(1)                                              O(1)           O(1)

<TKey,TValue>               

SortedDictionary

<TKey,TValue> O(log n)                                     O(log n)    O(log n)

SortedList                                                          O(n)          讀寫是O(log n),如果

<TKey,Tvalue>                                                                   鍵在列表中,就是O(logn);

                                                                                          如果鍵不在列表中,就是O(n)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved