C# 鍵控集合和 IDictionary
除實現(xiàn)IList接口外,集合還可以實現(xiàn)類似的IDictionary接口,允許項通過鍵值(如字符串名)進行索引,而不是通過一個索引。這也可以使用索引符來完成,但這次使用的索引符參數(shù)是一個與存儲的項相關(guān)聯(lián)的鍵,而不是int索引,這樣集合就更便于用戶使用了。
與索引的集合一樣,可使用一個基類簡化IDictionary接口的實現(xiàn),這個基類就是DictionaryBase,它也實現(xiàn)IEnumerable和ICollection,提供了對任何集合都相同的基本集合處理功能。
與CollectionBase —樣,DictionaryBase也實現(xiàn)通過其支持的接口獲得的一些成員(但不是全部成員)。 DictionaryBase也實現(xiàn)Clear和Count成員,但不實現(xiàn)RemoveAtO。這是因為RemoveAtO是IList接口中的一個 方法,而不是IDictionary接口中的一個方法。但是,IDictionary有一個Remove()方法,這是一個應(yīng)在基于DictionaryBase的定制集合類上實現(xiàn)的方法。
下面的代碼是Animals類的另一個版本,這次該類派生于DictionaryBase。這段代碼包括AddG、RemoveO 和一個通過鍵訪問的索引符的實現(xiàn)代碼:
public class Animals : DictionaryBase
{
public void Add(string newID, Animal newAnimal)=>
Dictionary.Add(newID, newAnimal);
public void Remove(string animallD)=>
Dictionary.Remove(animallD);
public Animals() {}
public Animal this[string animallD]
{
get { return (Animal)Dictionary[animallD]; }
set { Dictionary[animallD] = value;)
}
}
這些成員的區(qū)別如下:
?Add()—帶有兩個參數(shù):一個鍵和一個值,存儲在一起。字典集合有一個繼承于DictionaryBase的成員Dictionary,這個成員是一個IDictionary接口,有自己的AddO方法,該方法帶有兩個object參數(shù)。我們的實現(xiàn)代碼使用一個string值作為鍵,使用一個Animal對象作為與該鍵存儲在一起的數(shù)據(jù)。
?Remove()一以一個鍵(而不是對象引用)作為參數(shù)。刪除與指定鍵值相對應(yīng)的項。
?Indexei—使用一個字符串鍵值,而不是一個索引,用于通過Dictionary的繼承成員來訪問所存儲的項,這里仍需進行數(shù)據(jù)類型轉(zhuǎn)換。
基于DictionaryBase的集合和基于CollectionBase的集合之間的另一個區(qū)別是foreach的工作方式稍有區(qū)別。上一節(jié)中的集合可以直接從集合中提取Animal對象。使用foreach和DictionaryBase派生類可以提供DictionaryEntry結(jié)構(gòu),這是另一個在System.Collections名稱空間中定義的類型。要得到Animal對象本身,就必須使用這個結(jié)構(gòu)的Value成員,也可以使用結(jié)構(gòu)的Key成員得到相關(guān)的鍵。要使代碼等價于前面的代碼:
foreach (Animal myAnimal in animalCollection)
{
WriteLine($MNew {myAnimal.ToString()} object added to custom " +
$"collection, Name = {my Animal, Name)11);
}
需要使用以下代碼:
foreach (DictionaryEntry myEntry in animalCollection)
{
WriteLine($"New {myEntry.Value.ToString()} object added to " +
$"custom collection, Name = {((Animal)myEntry.Value).Name}");
}
可以采用許多方式來重寫這段代碼,以便直接通過foreach訪問Animal對象,其中最簡單的方式是實現(xiàn)一個迭代器。
點擊加載更多評論>>