C#学习笔记(二十)-- 键控集合和IDictionary

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

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

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

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

public class Animals : DictionaryBase
{
   public void Add(string newID, Animal newAnimal) => Dictionary.Add(newID, newAnimal);
   public void Remove(string animalID) => Dictionary.Remove(animalID);
   public Animals() {}
   public Animal this [string animalID]
   {
      get {return (Animal)Dictionary[animalID];}
      set {Dictionary[animalID] = value;}
   }
}

  这些成员的区别如下:

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

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

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

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

foreach (Animal myAnimal in animalCollection)
{
   WriteLine($"New {myAnimal.ToString()} object added to custom" + $"collection, Name = {myAnimal.Name}");
}

  需要使用以下代码:

foreach (DictionaryEntry myEntry in animalCollection)
{
   WriteLine($"New {myEntry.Value.ToString()} object added to " + $"custom colllection, Name = {((Animal)myEntry.value).Name}");
}

 可以采用许多方式来重写这段代码,以便直接通过foreach访问Animal对象,其中最简单的方式是实现一个迭代器。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值