網上看到的,記錄下來,供參考,備忘
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>
/// 通過Dictionary<K,V>傳遞參數
/// </summary>
/// <param name="sql"></param>
/// <param name="parms"></param>
/// <returns></returns>
public static SqlDataReader ExecuteReader(string sql, Dictionary<string, string> 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;
}