1. 程式人生 > >你能熟練使用Dictionary字典和List列表嗎?

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

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

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

            list.Add("d", 1);

           //3.0以上版本

           foreach(variteminlist)

            {

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

            }

           //KeyValuePair<T,K>

           foreach

(KeyValuePair<string,int> kvinlist)

            {

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

            }

           //過鍵的集合取

           foreach(stringkeyinlist.Keys)

            {

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

            }

           //直接取值

           foreach(int

valinlist.Values)

            {

               Console.WriteLine(val);

            } 

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

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

           for(inti = 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>

        publicstatic 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 [email protected]",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; 

        }