TryGetValue方法很常用,可以把“判斷鍵存在”和“根據鍵取值”兩步轉化為一步,這樣鍵的雜湊值只計算一次,是很有效率的。但注意IDictionary介面並沒有定義TryGetValue,而泛型介面IDictionary<T, V>定義了TryGetValue。而KeyedCollection類型卻繼承自類型Collection<T>,Collection<T>繼承介面ICollection<T>。原因應該是KeyedCollection不僅僅是字典,還包含一個線性表吧。因此KeyedCollection預設是沒有TryGetValue的。
但是KeyedCollection有一個受保護的成員:Dictionary屬性。正好返回一個泛型的IDictionary代表內部字典,因此改寫KeyedCollection時調用這個內部IDictionary的TryGetValue就可以了。
比如先定義一個簡單的類型:Student,Id屬性是成員的鍵。
class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
KeyedCollection這樣定義:
//+ using System.Collections.ObjectModel;
class MyKeyedCollection : KeyedCollection<int, Student>
{
//輔助添加方法
public void Add(int id, string name)
{
Add(new Student() { Id = id, Name = name });
}
//改寫抽象方法:GetKeyForItem
protected override int GetKeyForItem(Student item)
{
return item.Id;
}
//將受保護IDictionary的TryGetValue顯式定義
public bool TryGetValue(int key, out Student value)
{
return Dictionary.TryGetValue(key, out value);
}
}
範例程式碼:
var dic = new MyKeyedCollection();
dic.Add(3, "martin");
dic.Add(1, "tony");
dic.Add(2, "liu");
Student st;
if (dic.TryGetValue(1, out st))
Console.WriteLine(st.Name);
else
Console.WriteLine("沒找到");
輸出:
tony