4.11 在泛型字典類中使用foreach
問題
您希望在實現了System. Collections.Generic.IDictionary接口的類型枚舉元素,如System.Collections.Generic.Dictionary 或 System.Collections.Generic.SortedList。
解決方案
最簡單的方法是在foreach循環中使用KeyValuePair結構體:
// 創建字典對象並填充.
Dictionary<int, string> myStringDict = new Dictionary<int, string>();
myStringDict.Add(1, "Foo");
myStringDict.Add(2, "Bar");
myStringDict.Add(3, "Baz");
// 枚舉並顯示所有的鍵/值對.
foreach (KeyValuePair<int, string> kvp in myStringDict)
{
Console.WriteLine("key " + kvp.Key);
Console.WriteLine("Value " + kvp.Value);
}
討論
非泛型類System.Collections.Hashtable (對應的泛型版本為System.Collections.Generic.Dictionary class), System.Collections.CollectionBase和System.Collections.SortedList 類支持在foreach使用DictionaryEntry類型:
foreach (DictionaryEntry de in myDict)
{
Console.WriteLine("key " + de.Key);
Console.WriteLine("Value " + de.Value);
}
但是Dictionary對象支持在foreach循環中使用KeyValuePair<T,U>類型。這是因為GetEnumerator方法返回一個IEnumerator,而它依次返回KeyValuePair<T,U>類型,而不是DictionaryEntry類型。
KeyValuePair<T,U>類型非常合適在foreach循環中枚舉泛型Dictionary類。DictionaryEntry類型包含的是鍵和值的object對象,而KeyValuePair<T,U>類型包含的是鍵和值在創建一個Dictionary對象是被定義的原本類型。這提高了性能並減少了代碼量,因為您不再需要把鍵和值轉化為它們原來的類型。
閱讀參考
查看MSDN文檔中的“System.Collections.Generic.Dictionary Class”、“System.Collections.Generic. SortedList Class”和“System.Collections.Generic.KeyValuePair Structure”主題。
4.12類型參數的約束
問題
您希望創建泛型類型時,它的類型參數支持指定接口,如IDisposable。
解決方案
使用約束強制泛型的類型參數實現一個或多個指定接口:
public class DisposableList<T> : IList<T>
where T : IDisposable
{
private List<T> _items = new List<T>();
// 用於釋放列表中的項目的私有方法
private void Delete(T item)
{
item.Dispose();
}
}