C# 集合

          System.Collections 命名空間包含接口和類,這些接口和類定義各種對象(如列表、隊列、位數組、哈希表和字典)的集合。
          System.Collections.Generic 命名空間包含定義泛型集合的接口和類,泛型集合允許用戶創建強類型集合,它能提供比非泛型強類型集合更好的類型安全性和性能。
          System.Collections.Specialized 命名空間包含專用的和強類型的集合,例如,鏈接的列表詞典、位向量以及只包含字符串的集合。    

泛型最常見的用途是泛型集合,命名空間System.Collections.Generic 中包含了一些基於泛型的集合類,使用泛型集合類可以提供更高的類型安全性,還有更高的性能,避免了非泛型集合的重複的裝箱和拆箱。
      很多非泛型集合類都有對應的泛型集合類,我覺得最好還是養成用泛型集合類的好習慣,他不但性能上好而且 功能上要比非泛型類更齊全。下面是常用的非泛型集合類以及對應的泛型集合類:

非泛型集合類     泛型集合類
ArrayList        List<T>
HashTable     DIctionary<T>
Queue           Queue<T>
Stack             Stack<T>
SortedList     SortedList<T>

       我們用的比較多的非泛型集合類主要有  ArrayList類 和 HashTable類,其中當我們經常性的操作 數據信息時往往用HashTable 來存儲將要寫入到數據庫或者返回的信息,在這之間要不斷的進行類型的轉化,他給我們的幫助應該是非常大的,如果我們操縱的數據類型相對確定的化  用Dictionary<TKey,TValue>集合類來存儲數據就方便多了,例如我們需要在電子商務網站中存儲用戶的購物車信息( 商品名,對應的商品個數)時,完全可以用Dictionary<string,int > 來存儲購物車信息,而不需要任何的類型轉化

Hashtable 用法

.NET Framework 中, Hashtable System.Collections 命名空間提供的一個容器,用於處理和表現類似 key/value 的鍵值對,其中 key 通常可用來快速查找,同時 key 是區分大小寫; value 用於存儲對應於 key 的值。 Hashtable key/value 鍵值對均爲 object 類型,所以 Hashtable 可以支持任何類型的 key/value 鍵值對 .

在哈希表中添加一個 key/value 鍵值對: HashtableObject.Add(key,value);
在哈希表中去除某個 key/value 鍵值對: HashtableObject.Remove(key);
從哈希表中移除所有元素: HashtableObject.Clear();
判斷哈希表是否包含特定鍵 key HashtableObject.Contains(key);

 

        Hashtable ht = new Hashtable ();

   ht .Add ("a" , 123);

   ht .Add ("b" , 456);


     
// 遍歷哈希表需要用到DictionaryEntry Object

   foreach (DictionaryEntry de in ht )

   {

      MessageBox .Show (de .Key .ToString () + "   " + de .Value .ToString ());

   }

 

    // 對哈希表進行排序

    ArrayList akeys = new ArrayList (ht .Keys ); // 別忘了導入System.Collections

    akeys .Sort (); // 按字母順序進行排序

    foreach (string skey in akeys )

    {

        MessageBox .Show (skey + ":" );

        MessageBox .Show (ht [skey ].ToString ());// 排序後輸出

    }

ArrayList 用法

private static void AddToList (ArrayList list , string p )

        {

            if (list .Contains (p ) == false )

                list .Add (p );

        }

 

        private void button1_Click (object sender , EventArgs e )

        {

            ArrayList list = new ArrayList ();

            AddToList (list , "Table1" );

            AddToList (list , "Table4" );

            AddToList (list , "Table1" );

            AddToList (list , "Table3" );

            AddToList (list , "Table2" );

            AddToList (list , "Table2" );

 

            foreach (string s in list )

            {

                MessageBox .Show (s );

            }

       }

List

List <string > listStr = new List <string >();

            listStr .Add ("123" );

            listStr .Add ("456" );

            listStr .Add ("789" );

          MessageBox .Show (listStr [2]);// 789

 

Dictionary

泛型的優點( C# 編程指南)

C#  中典型的範型結構除了熟悉的 IList  , HashTable 之外還有一個並不常見的Dictionary 集合。

相比較而言,Dictionary 的性能是最好的,也屬於輕便型的集合。效率要大於HashTable ,其主要原因是Dictionary 支持強類型聲明的。

在公共語言運行庫和 C# 語言的早期版本中,通用化是通過在類型與通用基類型 Object 之間進行強制轉換來實現的,泛型提供了針對這種限制的解決方案。通過創建泛型類,您可以創建一個在編譯時類型安全的集合。

添加到 ArrayList 中的任何引用或值類型都將隱式地向上強制轉換爲 Object 。如果項是值類型,則必須在將其添加到列表中時進行裝箱操作,在檢索時進行取消裝箱操作。強制轉換以及裝箱和取消裝箱操作都會降低性能;在必須對大型集合進行循環訪問的情況下,裝箱和取消裝箱的影響非常明顯。

對於客戶端代碼,與 ArrayList 相比,使用 List<T> 時添加的唯一語法是聲明和實例化中的類型參數。雖然這稍微增加了些編碼的複雜性,但好處是您可以創建一個比 ArrayList 更安全並且速度更快的列表,特別適用於列表項是值類型的情況。

Dictionary 泛型類提供了從一組鍵到一組值的映射。字典中的每個添加項都由一個值及其相關聯的鍵組成。通過鍵來檢索值的速度是非常快的,接近於 O(1) ,這是因爲 Dictionary 類是作爲一個哈希表來實現的。

1

Dictionary <int , string > fruit = new Dictionary <int , string >();

         // 加入重複鍵會引發異常

         fruit .Add (1, " 蘋果" );

         fruit .Add (2, " 桔子" );

         fruit .Add (3, " 香蕉" );

         fruit .Add (4, " 菠蘿" );

 

         // 因爲引入了泛型,所以鍵取出後不需要進行Objectint 的轉換,值的集合也一樣

         foreach (int i in fruit .Keys )

           {

               MessageBox .Show (" 鍵是:" +i .ToString ()+ " 值是:" + fruit [i ]);

     }

2

Dictionary <string , string > fruit = new Dictionary <string , string >();

 

            // 加入重複鍵會引發異常

            fruit .Add ("1" , " 蘋果" );

            fruit .Add ("2" , " 桔子" );

            fruit .Add ("3" , " 香蕉" );

            fruit .Add ("4" , " 菠蘿" );

 

            // 因爲引入了泛型,所以鍵取出後不需要進行Objectint 的轉換,

            值的集合也一樣

            foreach (string   i in fruit .Keys )

            {

                MessageBox .Show (" 鍵是:" +i .ToString ()+ " 值是:" + fruit [i ]);

             }
發佈了68 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章