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