C#集合

轉自:http://www.cnblogs.com/feisky/archive/2009/10/29/1591956.htmlhtml

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

在System.Collections命名空間中提供了許多接口:數據庫

  • IEnumerable循環集合項目
  • ICollection能夠獲取集合中項目個數
  • IList項目列表
  • IDictionary提供了鍵碼索引
 
 

(一)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);
            }
        }
    }
}
 
 

(四)哈希表

1、哈希表(Hashtable)簡述
     在.NET Framework中,Hashtable是System.Collections命名空間提供的一個容器,用於處理和表現相似key/value的鍵值 對,其中key一般可用來快速查找,同時key是區分大小寫;value用於存儲對應於key的值。Hashtable中key/value鍵值對均爲 object類型,因此Hashtable能夠支持任何類型的key/value鍵值對.

2、哈希表的簡單操做
在哈希表中添加一個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"]); //此處將不會有任何輸出
     }
}

3、遍歷哈希表
遍歷哈希表須要用到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
}

4、對哈希表進行排序
     對哈希表進行排序在這裏的定義是對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);
    }

經常使用的屬性和方法以下:
 

 
經常使用屬性
屬性說明
 
獲取用於肯定字典中的鍵是否相等的 IEqualityComparer
 
獲取包含在 Dictionary 中的鍵/值對的數目。
 
獲取或設置與指定的鍵相關聯的值。
 
獲取包含 Dictionary 中的鍵的集合。
 
獲取包含 Dictionary 中的值的集合。
  經常使用的方法 方法說明
 
Add
將指定的鍵和值添加到字典中。
 
Dictionary 中移除全部的鍵和值。
 
肯定 Dictionary 是否包含指定的鍵。
 
肯定 Dictionary 是否包含特定值。
 
Equals 
已重載。 肯定兩個 Object 實例是否相等。 (從 Object 繼承。)
 
返回循環訪問 Dictionary 的枚舉數。
 
用做特定類型的哈希函數。 GetHashCode 適合在哈希算法和數據結構(如哈希表)中使用。 (從 Object 繼承。)
 
實現 System.Runtime.Serialization.ISerializable 接口,並返回序列化 Dictionary 實例所需的數據。
 
獲取當前實例的 Type。 (從 Object 繼承。)
 
實現 System.Runtime.Serialization.ISerializable 接口,並在完成反序列化以後引起反序列化事件。
 
肯定指定的 Object 實例是不是相同的實例。 (從 Object 繼承。)
 
Dictionary 中移除所指定的鍵的值。
 
返回表示當前 ObjectString。 (從 Object 繼承。)
 
獲取與指定的鍵相關聯的值。
相關文章
相關標籤/搜索