位置:首頁(yè) > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 鍵控集合和 IDictionary

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-07

    除實(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è)迭代器。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部