C# 键控集合和 IDictionary
除实现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对象,其中最简单的方式是实现一个迭代器。
点击加载更多评论>>