C# 集合框架

http://blog.csdn.net/majiabao123/article/details/4054820

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

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);//集體添加方法一
            }
            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++)//數組是length
            {
                int number = (int)al2[i];//一定要強制轉換
                Console.WriteLine(number);//遍歷方法二

            }
        }
    }
}
 
 
(二)Queue:隊列,表示對象的先進先出集合。Enqueue方法入隊列,Dequeue方法出隊列。

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Queue qu = new Queue();
            Queue qu2 = new Queue();
            foreach (int i in new int[4] { 1, 2, 3, 4 })
            {
                qu.Enqueue(i);//入隊
                qu2.Enqueue(i);
            }

            foreach (int i in qu)
            {
                Console.WriteLine(i);//遍歷
            }

            qu.Dequeue();//出隊
            Console.WriteLine("Dequeue");
            foreach (int i in qu)
            {
                Console.WriteLine(i);
            }

            qu2.Peek();//返回位於 Queue 開始處的對象但不將其移除。
            Console.WriteLine("Peek");
            foreach (int i in qu2)
            {
                Console.WriteLine(i);
            }
        }
    }
}
 
 
(三)Stack:棧,表示對象的簡單的後進先出非泛型集合。Push方法入棧,Pop方法出棧。

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack sk = new Stack();
            Stack sk2 = new Stack();
            foreach (int i in new int[4] { 1, 2, 3, 4 })
            {
                sk.Push(i);//入棧
                sk2.Push(i);
            }

            foreach (int i in sk)
            {
                Console.WriteLine(i);//遍歷
            }

            sk.Pop();//出棧
            Console.WriteLine("Pop");
            foreach (int i in sk)
            {
                Console.WriteLine(i);
            }

            sk2.Peek();//彈出最後一項不刪除
            Console.WriteLine("Peek");
            foreach (int i in sk2)
            {
                Console.WriteLine(i);
            }
        }
    }
}
 
(四)哈希表
一、哈希表(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);
下面控制台程序將包含以上所有操作:

using System;
using System.Collections; //使用Hashtable時,必須引入這個命名空間
class hashtable
{
     public static void Main()
     {
     Hashtable ht=new Hashtable(); //創建一個Hashtable實例
     ht.Add("E","e");//添加key/value鍵值對
     ht.Add("A","a");
     ht.Add("C","c");
     ht.Add("B","b");
     string s=(string)ht["A"];
     if(ht.Contains("E")) //判斷哈希表是否包含特定鍵,其返回值為true或false
       Console.WriteLine("the E key:exist");
     ht.Remove("C");//移除一個key/value鍵值對
     Console.WriteLine(ht["A"]);//此處輸出a
     ht.Clear();//移除所有元素
     Console.WriteLine(ht["A"]); //此處將不會有任何輸出
     }
}

三、遍歷哈希表
遍歷哈希表需要用到DictionaryEntry Object,代碼如下:

for(DictionaryEntry de in ht) //ht為一個Hashtable實例
{
    Console.WriteLine(de.Key);//de.Key對應於key/value鍵值對key
    Console.WriteLine(de.Value);//de.Key對應於key/value鍵值對value
}

四、對哈希表進行排序
     對哈希表進行排序在這裡的定義是對key/value鍵值對中的key按一定規則重新排列,但是實際上這個定義是不能實現的,因為我們無法直接在Hashtable進行對key進行重新排列,如果需要Hashtable提供某種規則的輸出,可以采用一種變通的做法:

ArrayList akeys=new ArrayList(ht.Keys); //別忘了導入System.Collections
akeys.Sort(); //按字母順序進行排序
foreach(string skey in akeys)
{
    Console.Write(skey + ":");
    Console.WriteLine(ht[skey]);//排序後輸出
}
 
(五)SortedList類:表示鍵/值對的集合,與哈希表類似,區別在於SortedList中的Key數組排好序的。


using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{
    class Program
    {
        public static void Main()
        {
            SortedList sl = new SortedList();
            sl["c"] = 41;
            sl["a"] = 42;
            sl["d"] = 11;
            sl["b"] = 13;

            foreach (DictionaryEntry element in sl)
            {
                string s = (string)element.Key;
                int i = (int)element.Value;
                Console.WriteLine("{0},{1}", s, i);
            }
        }
    }
}
 
(六)Dictionary 泛型集合 
泛型最常見的用途是泛型集合,命名空間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> 來存儲購物車信息,而不需要任何的類型轉化。

    下面是簡單的例子,包括聲明,填充鍵值對,移除鍵值對,遍歷鍵值對

    Dictionary<string, string> myDic = new Dictionary<string, string>();
    myDic.Add("aaa", "111");
    myDic.Add("bbb", "222");
    myDic.Add("ccc", "333");
    myDic.Add("ddd", "444");
    //如果添加已經存在的鍵,add方法會拋出異常
    try
    {
        myDic.Add("ddd","ddd");
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine("此鍵已經存在:" + ex.Message);
    }
    //解決add()異常的方法是用ContainsKey()方法來判斷鍵是否存在
    if (!myDic.ContainsKey("ddd"))
    {
        myDic.Add("ddd", "ddd");
    }
    else
    {
        Console.WriteLine("此鍵已經存在:");
    
    }
    
    //而使用索引器來負值時,如果建已經存在,就會修改已有的鍵的鍵值,而不會拋出異常
    myDic ["ddd"]="ddd";
    myDic["eee"] = "555";
    
    //使用索引器來取值時,如果鍵不存在就會引發異常
    try
    {
        Console.WriteLine("不存在的鍵/"fff/"的鍵值為:" + myDic["fff"]);
    }
    catch (KeyNotFoundException ex)
    {
        Console.WriteLine("沒有找到鍵引發異常:" + ex.Message);
    }
    //解決上面的異常的方法是使用ContarnsKey() 來判斷時候存在鍵,如果經常要取健值得化最好用 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 中的鍵/值對的數目。 
  Item  獲取或設置與指定的鍵相關聯的值。 
  Keys  獲取包含 Dictionary 中的鍵的集合。 
  Values  獲取包含 Dictionary 中的值的集合。 
  常用的方法 方法說明  
  Add  將指定的鍵和值添加到字典中。  
  Clear  從 Dictionary 中移除所有的鍵和值。 

 ContainsKey  確定 Dictionary 是否包含指定的鍵。  
  ContainsValue  確定 Dictionary 是否包含特定值。  
  Equals   已重載。 確定兩個 Object 實例是否相等。 (從 Object 繼承。) 
  GetEnumerator  返回循環訪問 Dictionary 的枚舉數。  
  GetHashCode   用作特定類型的哈希函數。GetHashCode 適合在哈希算法和數據結構(如哈希表)中使用。 (從 Object 繼承。) 
  GetObjectData  實現 System.Runtime.Serialization.ISerializable 接口,並返回序列化 Dictionary 實例所需的數據。  
  GetType   獲取當前實例的 Type。 (從 Object 繼承。) 
  OnDeserialization  實現 System.Runtime.Serialization.ISerializable 接口,並在完成反序列化之後引發反序列化事件。  
  ReferenceEquals   確定指定的 Object 實例是否是相同的實例。 (從 Object 繼承。) 
  Remove  從 Dictionary 中移除所指定的鍵的值。  
  ToString   返回表示當前 Object 的 String。 (從 Object 繼承。) 
  TryGetValue  獲取與指定的鍵相關聯的值。 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值