位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 键控集合和 IDictionary

提问人:刘团圆发布时间:2020-12-07

    除实现IList接口外,集合还可以实现类似的IDictionary接口,允许项通过键值(如字符串名)进行索引,而不是通过一个索引。这也可以使用索引符来完成,但这次使用的索引符参数是一个与存储的项相关联的键,而不是int索引,这样集合就更便于用户使用了。

    与索引的集合一样,可使用一个基类简化IDictionary接口的实现,这个基类就是DictionaryBase,它也实现IEnumerable和ICollection,提供了对任何集合都相同的基本集合处理功能。

    与CollectionBase —样,DictionaryBase也实现通过其支持的接口获得的一些成员(但不是全部成员)。 DictionaryBase也实现Clear和Count成员,但不实现RemoveAtO。这是因为RemoveAtO是IList接口中的一个 方法,而不是IDictionary接口中的一个方法。但是,IDictionary有一个Remove()方法,这是一个应在基于DictionaryBase的定制集合类上实现的方法。

    下面的代码是Animals类的另一个版本,这次该类派生于DictionaryBase。这段代码包括AddG、RemoveO 和一个通过键访问的索引符的实现代码:

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;)

    }

}

这些成员的区别如下:

    •Add()—带有两个参数:一个键和一个值,存储在一起。字典集合有一个继承于DictionaryBase的成员Dictionary,这个成员是一个IDictionary接口,有自己的AddO方法,该方法带有两个object参数。我们的实现代码使用一个string值作为键,使用一个Animal对象作为与该键存储在一起的数据。

    •Remove()一以一个键(而不是对象引用)作为参数。删除与指定键值相对应的项。

    •Indexei—使用一个字符串键值,而不是一个索引,用于通过Dictionary的继承成员来访问所存储的项,这里仍需进行数据类型转换。

基于DictionaryBase的集合和基于CollectionBase的集合之间的另一个区别是foreach的工作方式稍有区别。上一节中的集合可以直接从集合中提取Animal对象。使用foreach和DictionaryBase派生类可以提供DictionaryEntry结构,这是另一个在System.Collections名称空间中定义的类型。要得到Animal对象本身,就必须使用这个结构的Value成员,也可以使用结构的Key成员得到相关的键。要使代码等价于前面的代码:

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对象,其中最简单的方式是实现一个迭代器。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部