久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C#集合類總結

 秋水風帆 2010-12-23
 C# 集合類總結 收藏
我們用的比較多的非泛型集合類主要有 ArrayList 類 和 HashTable 類,。我們經(jīng)常用 HashTable 來存儲將要寫入到數(shù)據(jù)庫或者返回的信息,在這之間要不斷的進行類型的轉化,,增加了系統(tǒng)裝箱和拆箱的負擔,,如果我們操縱的數(shù)據(jù)類型相對確定的化 用 Dictionary<TKey,TValue> 集合類來存儲數(shù)據(jù)就方便多了,例如我們需要在電子商務網(wǎng)站中存儲用戶的購物車信息 ( 商品名,,對應的商品個數(shù) ) 時,,完全可以用 Dictionary<string, int> 來存儲購物車信息,而不需要任何的類型轉化,。
 
1. 數(shù)組是固定大小的,,不能伸縮。雖然 System.Array.Resize 這個泛型方法可以重置數(shù)組大小,,
 
但是該方法是重新創(chuàng)建新設置大小的數(shù)組,,用的是舊數(shù)組的元素初始化。隨后以前的數(shù)組就廢棄,!而集合卻是可變長的
 
2. 數(shù)組要聲明元素的類型,,集合類的元素類型卻是 object.
 
3. 數(shù)組可讀可寫不能聲明只讀數(shù)組。集合類可以提供 ReadOnly 方法以只讀方式使用集合,。
 
4. 數(shù)組要有整數(shù)下標才能訪問特定的元素,,然而很多時候這樣的下標并不是很有用,。集合也是數(shù)據(jù)列表卻不使用下標訪問。
 
很多時候集合有定制的下標類型,,對于隊列和棧根本就不支持下標訪問,!
 
1.       數(shù)組
 
int[] intArray1;
// 初始化已聲明的一維數(shù)組
intArray1 = new int[3];
intArray1 = new int[3]{1,2,3};
intArray1 = new int[]{1,2,3};
 
2.  ArrayList 類對象被設計成為一個動態(tài)數(shù)組類型,其容量會隨著需要而適當?shù)臄U充方法
 
1 : Add() 向數(shù)組中添加一個元素,,
2 : Remove() 刪除數(shù)組中的一個元素
3 : RemoveAt(int i) 刪除數(shù)組中索引值為 i 的元素
4 : Reverse() 反轉數(shù)組的元素
5 : Sort() 以從小到大的順序排列數(shù)組的元素
6 : Clone() 復制一個數(shù)組
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
 
namespace ConsoleApplication1
{
     class Program
      {
         static void Main(string[] args)
          {
             ArrayList al = new ArrayList();
             al.Add(100);// 單個添加
               foreach (int number in new int[6] { 9, 3, 7, 2, 4, 8 })
              {
                 al.Add(number);// 集體添加方法一 // 清清月兒 http://blog.csdn.net/21aspnet/
             }
              int[] number2 = new int[2] { 11,12 };
             al.AddRange(number2);// 集體添加方法二
             al.Remove(3);// 移除值為 3 的
             al.RemoveAt(3);// 移除第 3 個
             ArrayList al2 = new ArrayList(al.GetRange(1, 3));// 新 ArrayList 只取舊 ArrayList 一部份
 
             Console.WriteLine(" 遍歷方法一 :");
             foreach (int i in al)// 不要強制轉換
              {
                 Console.WriteLine(i);// 遍歷方法一
             }
             Console.WriteLine(" 遍歷方法二 :");
             for (int i = 0; i != al2.Count; i++)// 數(shù)組是 length
              {
                 int number = (int)al2[i];// 一定要強制轉換
                 Console.WriteLine(number);// 遍歷方法二
              }
         }
     }
  }
 
3.       List
可通過索引訪問的對象的強類型列表,。提供用于對列表進行搜索、排序和操作的方法 , 在決定使用 List 還是使用 ArrayList 類(兩者具有類似的功能)時,,記住 List 類在大多數(shù)情況下執(zhí)行得更好并且是類型安全的,。如果對 List 類的類型 T 使用引用類型,則兩個類的行為是完全相同的,。但是,,如果對類型 T 使用值類型,則需要考慮實現(xiàn)和裝箱問題,。
 
如果對類型 T 使用值類型,,則編譯器將特別針對該值類型生成 List 類的實現(xiàn)。這意味著不必對 List 對象的列表元素進行裝箱就可以使用該元素,,并且在創(chuàng)建大約 500 個列表元素之后,,不對列表元素裝箱所節(jié)省的內存將大于生成該類實現(xiàn)所使用的內存。
 
// 聲明一個 List 對象,,只加入 string 參數(shù)
List<string> names = new List<string>();
names.Add(" 喬峰 ");
names.Add(" 歐陽峰 ");
names.Add(" 馬蜂 ");
// 遍歷 List
foreach (string name in names)
{
Console.WriteLine(name);
}
 
// 向 List 中插入元素
names.Insert(2, " 張三峰 ");
 
// 移除指定元素
names.Remove(" 馬蜂 ");
 
4. Dictionary
表示鍵和值的集合。 Dictionary 遍歷輸出的順序,,就是加入的順序,,這點與 Hashtable 不同
Dictionary<string, string> myDic = new Dictionary<string, string>();
myDic.Add("aaa", "111");
myDic.Add("bbb", "222");
myDic.Add("ccc", "333");
myDic.Add("ddd", "444");
 
// 如果添加已經(jīng)存在的鍵, add 方法會拋出異常
     try
       {
         myDic.Add("ddd","ddd");
     }
     catch (ArgumentException ex)
       {
          Console.WriteLine(" 此鍵已經(jīng)存在: " + ex.Message);
     }
 
     // 解決 add() 異常的方法是用 ContainsKey() 方法來判斷鍵是否存在
     if (!myDic.ContainsKey("ddd"))
       {
         myDic.Add("ddd", "ddd");
     }
     else
       {
         Console.WriteLine(" 此鍵已經(jīng)存在: ");
     }
 
      // 而使用索引器來負值時,,如果建已經(jīng)存在,,就會修改已有的鍵的鍵值,而不會拋出異常
     myDic ["ddd"]="ddd";
     myDic["eee"] = "555";
 
     // 使用索引器來取值時,,如果鍵不存在就會引發(fā)異常
     try
       {
         Console.WriteLine(" 不存在的鍵 ""fff"" 的鍵值為: " + myDic["fff"]);
     }
     catch (KeyNotFoundException ex)
        {
         Console.WriteLine(" 沒有找到鍵引發(fā)異常: " + ex.Message);
     }
 
     // 解決上面的異常的方法是使用 ContarnsKey() 來判斷時候存在鍵,,如果經(jīng)常要取健值得化最好用 TryGetValue 方法來獲取集合中的對應鍵值
 
     string value = "";
     if (myDic.TryGetValue("fff", out value))
       {
         Console.WriteLine(" 不存在的鍵 ""fff"" 的鍵值為: " + value );
     }
     else
       {   
         Console.WriteLine(" 沒有找到對應鍵的鍵值 ");
     }
 
     // 下面用 foreach 來遍歷鍵值對
     // 泛型結構體 用來存儲健值對
     foreach (KeyValuePair<string, string> kvp in myDic)
       {
         Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
     }
 
     // 獲取值得集合
     foreach (string s in myDic.Values)
       {
         Console.WriteLine("value={0}", s);
     }
 
     // 獲取值得另一種方式
     Dictionary<string, string>.ValueCollection values = myDic.Values;
     foreach (string s in values)
       {
         Console.WriteLine("value={0}", s);
     }
 
常用的屬性和方法如下     
 
 常用屬性
 屬性說明
 
 
 Comparer
 獲取用于確定字典中的鍵是否相等的 IEqualityComparer 。
 
 
 Count
 獲取包含在 Dictionary 中的鍵 / 值對的數(shù)目,。
 
 
 Item
 獲取或設置與指定的鍵相關聯(lián)的值,。
 
 
 Keys
 獲取包含 Dictionary 中的鍵的集合。
 
 
 Values
 獲取包含 Dictionary 中的值的集合,。
 
 
 常用的方法
 方法說明
 
 
 Add
 將指定的鍵和值添加到字典中,。
 
 
 Clear
 從 Dictionary 中移除所有的鍵和值。
 
 
 ContainsKey
 確定 Dictionary 是否包含指定的鍵,。
 
 
 ContainsValue
 確定 Dictionary 是否包含特定值,。
 
 
 Equals  
 已重載,。 確定兩個 Object 實例是否相等。 (從 Object 繼承,。)
 
 
 GetEnumerator
 返回循環(huán)訪問 Dictionary 的枚舉數(shù),。
 
 
 GetHashCode  
 用作特定類型的哈希函數(shù)。 GetHashCode 適合在哈希算法和數(shù)據(jù)結構(如哈希表)中使用,。 (從 Object 繼承,。)
 
 
 GetObjectData
 實現(xiàn) System.Runtime.Serialization.ISerializable 接口,并返回序列化 Dictionary 實例所需的數(shù)據(jù),。
 
 
 GetType  
 獲取當前實例的 Type ,。 (從 Object 繼承。)
 
 
 OnDeserialization
 實現(xiàn) System.Runtime.Serialization.ISerializable 接口,,并在完成反序列化之后引發(fā)反序列化事件,。
 
 
 ReferenceEquals  
 確定指定的 Object 實例是否是相同的實例。 (從 Object 繼承,。)
 
 
 Remove
 從 Dictionary 中移除所指定的鍵的值,。
 
 
 ToString  
 返回表示當前 Object 的 String 。 (從 Object 繼承,。)
 
 
 TryGetValue
 獲取與指定的鍵相關聯(lián)的值,。
 
 
5.       SortedList 類
與哈希表類似,區(qū)別在于 SortedList 中的 Key 數(shù)組排好序的
 
//SortedList
 
System.Collections.SortedList list=new System.Collections.SortedList();
list.Add("key2",2);
list.Add("key1",1);
for(int i=0;i<list.Count;i++)
{
System.Console.WriteLine(list.GetKey(i));
}
 
 
6.Hashtable 類
 
哈希表 ,, 名 - 值對,。類似于字典 ( 比數(shù)組更強大 ) 。哈希表是經(jīng)過優(yōu)化的,,訪問下標的對象先散列過,。如果以任意類型鍵值訪問其中元素會快于其他集合。
 
GetHashCode() 方法返回一個 int 型數(shù)據(jù),,使用這個鍵的值生成該 int 型數(shù)據(jù),。哈希表獲取這個值最后返回一個索引,表示帶有給定散列的數(shù)據(jù)項在字典中存儲的位置,。
 
Hashtable 和 Dictionary <K, V> 類型
  1 :單線程程序中推薦使用 Dictionary, 有泛型優(yōu)勢 , 且讀取速度較快 , 容量利用更充分 .
  2 :多線程程序中推薦使用 Hashtable, 默認的 Hashtable 允許單線程寫入 , 多線程讀取 , 對 Hashtable 進一步調用 Synchronized() 方法可以獲得完全線程安全的類型 . 而 Dictionary 非線程安全 , 必須人為使用 lock 語句進行保護 , 效率大減 .
  3 : Dictionary 有按插入順序排列數(shù)據(jù)的特性 ( 注 : 但當調用 Remove() 刪除過節(jié)點后順序被打亂 ), 因此在需要體現(xiàn)順序的情境中使用 Dictionary 能獲得一定方便 .
 
HashTable 中的 key/value 均為 object 類型,,由包含集合元素的存儲桶組成。存儲桶是 HashTable 中各元素的虛擬子組,,與大多數(shù)集合中進行的搜索和檢索相比,,存儲桶可令搜索和檢索更為便捷。每一存儲桶都與一個哈希代碼關聯(lián),,該哈希代碼是使用哈希函數(shù)生成的并基于該元素的鍵,。 HashTable 的優(yōu)點就在于其索引的方式,速度非常快,。如果以任意類型鍵值訪問其中元素會快于其他集合,,特別是當數(shù)據(jù)量特別大的時候,效率差別尤其大,。
 
HashTable 的應用場合有:做對象緩存,,樹遞歸算法的替代,和各種需提升效率的場合,。
 
    //Hashtable sample
    System.Collections.Hashtable ht = new System.Collections.Hashtable();
    //--Be careful: Keys can't be duplicated, and can't be null----
    ht.Add(1, "apple");
    ht.Add(2, "banana");
    ht.Add(3, "orange");   
    //Modify item value:
    if(ht.ContainsKey(1))
        ht[1] = "appleBad";
    //The following code will return null oValue, no exception
    object oValue = ht[5];    
    //traversal 1:
    foreach (DictionaryEntry de in ht)
    {
        Console.WriteLine(de.Key);
        Console.WriteLine(de.Value);
    }
    //traversal 2:
    System.Collections.IDictionaryEnumerator d = ht.GetEnumerator();
    while (d.MoveNext())
    {
        Console.WriteLine("key : {0} value : {1}", d.Entry.Key, d.Entry.Value);
    }
    //Clear items
    ht.Clear();
 
 
Dictionary 和 HashTable 內部實現(xiàn)差不多,,但前者無需裝箱拆箱操作,效率略高一點,。
 
    //Dictionary sample
    System.Collections.Generic.Dictionary<int, string> fruits =          new System.Collections.Generic.Dictionary<int, string>();
    fruits.Add(1, "apple");
    fruits.Add(2, "banana");
    fruits.Add(3, "orange");
    foreach (int i in fruits.Keys)
    {
        Console.WriteLine("key : {0} value : {1}", i, fruits);     }
 
    if (fruits.ContainsKey(1))
    {
        Console.WriteLine("contain this key.");
    }
 
 
HashTable 是經(jīng)過優(yōu)化的,,訪問下標的對象先散列過,所以內部是無序散列的,,保證了高效率,,也就是說,其輸出不是按照開始加入的順序,,而 Dictionary 遍歷輸出的順序,,就是加入的順序,這點與 Hashtable 不同,。如果一定要排序 HashTable 輸出,,只能自己實現(xiàn):
 
    //Hashtable sorting
    System.Collections.ArrayList akeys = new System.Collections.ArrayList(ht.Keys); //from Hashtable
    akeys.Sort(); //Sort by leading letter
    foreach (string skey in akeys)
    {
        Console.Write(skey + ":");
        Console.WriteLine(ht[skey]);
    }
 
HashTable 與線程安全:
 
為了保證在多線程的情況下的線程同步訪問安全,微軟提供了自動線程同步的 HashTable:
如果 HashTable 要允許并發(fā)讀但只能一個線程寫 , 要這么創(chuàng)建 HashTable 實例 :
 
    //Thread safe HashTable
    System.Collections.Hashtable htSyn = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable());
 
這樣 , 如果有多個線程并發(fā)的企圖寫 HashTable 里面的 item, 則同一時刻只能有一個線程寫 , 其余阻塞 ; 對讀的線程則不受影響,。
 
另外一種方法就是使用 lock 語句,,但要 lock 的不是 HashTable ,而是其 SyncRoot ,;雖然不推薦這種方法,,但效果一樣的,因為源代碼就是這樣實現(xiàn)的 :
 
//Thread safe
private static System.Collections.Hashtable htCache = new System.Collections.Hashtable ();
 
public static void AccessCache ()
{
    lock ( htCache.SyncRoot )
    {
        htCache.Add ( "key", "value" );
 
        //Be careful: don't use foreach to operation on the whole collection
        //Otherwise the collection won't be locked correctly even though indicated locked
        //--by MSDN
    }
}
 
 
//Is equivalent to 等同于 (lock is equivalent to Monitor.Enter and Exit()
public static void AccessCache ()
{
    System.Threading.Monitor.Enter ( htCache.SyncRoot );
 
    try
    {
        /* critical section */
        htCache.Add ( "key", "value" );
 
        //Be careful: don't use foreach to operation on the whole collection
        //Otherwise the collection won't be locked correctly even though indicated locked
        //--by MSDN
    }
    finally
    {
        System.Threading.Monitor.Exit ( htCache.SyncRoot );
    }
}
 
7. Stack 類
棧,,后進先出。 push 方法入棧,, pop 方法出棧,。
 
System.Collections.Stack stack=new System.Collections.Stack();
stack.Push(1);
stack.Push(2);
 
System.Console.WriteLine(stack.Peek());
while(stack.Count>0)
{
System.Console.WriteLine(stack.Pop());
}
 
8.Queue 類
隊列,先進先出,。 enqueue 方法入隊列,, dequeue 方法出隊列。
 
System.Collections.Queue queue=new System.Collections.Queue();
queue.Enqueue(1);
queue.Enqueue(2);
 
System.Console.WriteLine(queue.Peek());
while(queue.Count>0)
{
System.Console.WriteLine(queue.Dequeue());
}
發(fā)表于 @ 2010年01月23日 11:57:00 | 評論( 0 ) | 編輯| 舉報| 收藏
舊一篇:C#雜問 | 新一篇:C#實現(xiàn)的兩個淘寶插件源碼

本文來自CSDN博客,,轉載請標明出處:http://blog.csdn.net/zhenjing/archive/2010/01/24/5248070.aspx

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多