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

C# 鍵控集合和 IDictionary

提問人:劉團圓發(fā)布時間:2020-12-07

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

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

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