你能熟練使用Dictionary字典和List列表嗎?

命名空間System.Collections.Generic中有兩個非常重要,而且常用的泛型集合類,它們分別是Dictionary<TKey,TValue>字典和List<T>列表。Dictionary字典通常用於保存鍵/值對的數據,而List列表通中用於保存可通過索引訪問的對象的強類型列表。下面來總結一下,用代碼來演示怎麼初始化,增加,修改,刪除和遍歷元素。

namespace DictionaryDemo1
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建Dictionary<TKey,TValue>對象
            Dictionary<string, string> openWith = new Dictionary<string, string>();

            //添加元素到對象中,共有兩種方法。注意,字典中的鍵不可以重複,但值可以重複。
            //方法一:使用對象的Add()方法
            openWith.Add("txt", "notepad.exe");
            openWith.Add("bmp", "paint.exe");
            openWith.Add("dib", "paint.exe");
            openWith.Add("rtf", "wordpad.exe");

            //方法二:使用索引器Indexer
            //openWith["txt"] = "notepad.exe";
            //openWith["bmp"] = "paint.exe";
            //openWith["dib"] = "paint.exe";
            //openWith["rtf"] = "wordpad.exe";

            //增加元素,注意增加前必須檢查要增加的鍵是否存在使用ContainsKey()方法
            if (!openWith.ContainsKey("ht"))
            {
                openWith.Add("ht", "hypertrm.exe");//或openWith["ht"] = "hypertrm.exe";
                Console.WriteLine("增加元素成功!Key={0},Value={1}","ht",openWith["ht"]);
            }

            //刪除元素,使用Remove()方法
            if (openWith.ContainsKey("rtf"))
            {
                openWith.Remove("rtf");
                Console.WriteLine("刪除元素成功!鍵爲rtf");
            }

            if (!openWith.ContainsKey("rtf"))
            {
                Console.WriteLine("Key=\"rtf\"的元素找不到!");
            }

            //修改元素,使用索引器
            if (openWith.ContainsKey("txt"))
            {
                openWith["txt"] = "notepadUpdate.exe";
                Console.WriteLine("修改元素成功!Key={0},Value={1}", "txt", openWith["txt"]);
            }

            //遍歷元素,因爲該類實現了IEnumerable接口,所以可以使用foreach語句,注意元素類型是 KeyValuePair(Of TKey, TValue)
            foreach (KeyValuePair<string, string> kvp in openWith)
            {
                Console.WriteLine("Key={0},Value={1}",kvp.Key,kvp.Value);
            }

            Console.WriteLine("遍歷元素完成!");
            Console.ReadKey();
        }
    }
}

  程序輸出結果:

C# Dictionary 的幾種遍歷方法

網上看到的,記錄下來,供參考,備忘

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

 

            list.Add("d", 1);

 

            //3.0以上版本

            foreach (var item in list)

            {

                Console.WriteLine(item.Key + item.Value);

            }

            //KeyValuePair<T,K>

            foreach (KeyValuePair<string, int> kv in list)

            {

                Console.WriteLine(kv.Key + kv.Value);

            }

            //過鍵的集合取

            foreach (string key in list.Keys)

            {

                Console.WriteLine(key + list[key]);

            }

            //直接取值

            foreach (int val in list.Values)

            {

                Console.WriteLine(val);

            } 

            //非要採用for的方法也可

            List<string> test = new List<string>(list.Keys);

 

            for (int i = 0; i < list.Count; i++)

            {

                Console.WriteLine(test[i] + list[test[i]]);

            }

Dictionary( TKey , TValue )

 

表示鍵和值的集合。

 

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

 

 

只要對象用作 Dictionary( TKey, TValue) 中的鍵,它就不能以任何影響其哈希值的方式更改。使用字典的相等比較器比較時,Dictionary( TKey, TValue) 中的任何鍵都必須是唯一的。鍵不能爲 null  但是如果值類型 TValue 爲引用類型,該值則可以爲空。

 

Dictionary( TKey, TValue) 需要一個相等實現來確定鍵是否相等。可以使用一個接受 comparer 參數的構造函數來指定IEqualityComparer( T) ) 泛型接口的實現;如果不指定實現,則使用默認的泛型相等比較器 EqualityComparer( T) ) . Default。如果類型 TKey 實現 System. IEquatable< (Of < ( T> ) > ) 泛型接口,則默認相等比較器會使用該實現。

 

 

 

Dictionary( TKey, TValue) 的容量是 Dictionary( TKey, TValue) 可以包含的元素數。當向 Dictionary( TKey, TValue) 中添加元素時,將通過重新分配內部數組來根據需要自動增大容量。

 

對於枚舉而言,字典中的每一項都被視爲一個表示值及其鍵的 KeyValuePair( TKey, TValue) 結構進行處理。項返回的順序未定義。

 

C# 語言的 foreach 語句(在 C++ 中爲 for each ,在 Visual Basic 中爲 For Each )需要集合中每個元素的類型。由於Dictionary( TKey, TValue) 是鍵和值的集合,因此元素類型並非鍵類型或值類型。相反,元素類型是鍵類型和值類型的KeyValuePair( TKey, TValue) 。例如:

 

此類型的公共靜態(在 Visual Basic 中爲 Shared )成員是線程安全的。但不能保證任何實例成員是線程安全的。

 

只要不修改該集合,Dictionary( TKey, TValue) 就可以同時支持多個閱讀器。即便如此,從頭到尾對一個集合進行枚舉本質上並不是一個線程安全的過程。當出現枚舉與寫訪問互相爭用這種極少發生的情況時,必須在整個枚舉過程中鎖定集合。若要允許多個線程訪問集合以進行讀寫操作,則必須實現自己的同步。

///summary ///通過DictionaryK,V傳遞參數 ////summary ///paramname=sql/param ///paramname=parms/param ///returns/returns public static SqlDataReaderExecuteReader( string sql,Dictionary string , string parms) { SqlDataReadersqlReader= null ;
 

/// <summary> 

        /// 通過Dictionary<K,V>傳遞參數 

        /// </summary> 

        /// <param name="sql"></param> 

        /// <param name="parms"></param> 

        /// <returns></returns> 

        public static SqlDataReader ExecuteReader(string sql, Dictionary<stringstring> parms) 

        { 

            SqlDataReader sqlReader = null

            SqlConnection sqlConn = new SqlConnection(conStr); 

            SqlCommand sqlCmd = new SqlCommand(sql, sqlConn); 

            foreach (string key in parms.Keys) 

            { 

                sqlCmd.Parameters.Add("@" + key, parms[key]); 

            } 

            sqlConn.Open(); 

            sqlReader = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection); 

            return sqlReader; 

        } 

 

  

 

調用如下: 

 

============= 

 

 public UserRole GetRoleByID(int roleId) 

        { 

            string sql = string.Format("select id roleid,rolename from userrole where id=@ID",roleId); 

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

            sqlParams.Add("ID",roleId.ToString()); 

 

            UserRole ur=null

            using (SqlDataReader sqlReader = DBHelper.ExecuteReader(sql,sqlParams)) 

            { 

                while (sqlReader.Read()) 

                { 

                    ur = new UserRole((int)sqlReader["roleid"], sqlReader["rolename"].ToString()); 

                } 

                sqlReader.Close(); 

            } 

            return ur; 

        } 



List<T>列表

namespace ListDemo1
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建List<T>列表對象
            List<string> dinosaurs = new List<string>();

            //增加元素到列表(或稱爲初始化),注意初始化時不能使用索引器,因爲沒有增加元素之前list列表是空的
            dinosaurs.Add("Tyrannosaurus");
            dinosaurs.Add("Amargasaurus");
            dinosaurs.Add("Mamenchisaurus");
            dinosaurs.Add("Deinonychus");
            dinosaurs.Add("Compsognathus");

            //一個重要屬性
            Console.WriteLine("列表中的元素數爲: {0}", dinosaurs.Count);//獲取 List 中實際包含的元素數
            

            //插入元素,使用Insert()方法
            dinosaurs.Insert(2, "Compsognathus");//將元素插入到指定索引處,原來此位置的元素後移
            Console.WriteLine("在索引爲2的位置插入了元素{0}",dinosaurs[2]);

            //刪除元素,使用Remove()方法
            dinosaurs.Remove("Compsognathus");//從 List 中移除特定對象的第一個匹配項
            Console.WriteLine("刪除第一個名爲Compsognathus的元素!");

            //修改元素,使用索引器
            dinosaurs[0] = "TyrannosaurusUpdate";
            Console.WriteLine("修改索引爲0的元素成功!");

            //遍歷元素,使用foreach語句,元素類型爲string
            foreach (string dinosaur in dinosaurs)
            {
                Console.WriteLine(dinosaur);
            }

            Console.WriteLine("遍歷元素完成!");
            Console.ReadKey();
        }
    }
}

程序輸出結果:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章