如何通过索引对嵌套的OrderedDictionary中的元素调用方法



我使用一个名为toolSystem的嵌套有序字典将工具存储到类别和子类型中。toolSystem.add正在添加类别和gardeningTools.add正在添加该类别的子类型(例如toolSystem具有gardeningTools类别和lineTrimer的子类型,lineTrimer是工具类的数组(。

OrderedDictionary toolSystem = new OrderedDictionary();
OrderedDictionary gardeningTools = new OrderedDictionary();
ToolCollection lineTrimmers = new ToolCollection(0);
Tool newTool = new Tool("Hose", 1, 1);
toolSystem.Add("Gardening Tools", gardeningTools);
gardeningTools.Add("Line Trimmers", lineTrimmers);

ToolSystem有一个名为add的方法,它具有以下签名:

public void add(Tool tool);

我遇到的问题是,我需要向lineTrimmers字典添加一个新的Tool实例,但我的方法作用域只能访问toolSystem字典,所以我不能直接使用lineTrimmers引用。

是否仍然可以使用按索引添加。例如toolSystem[0][0].add(newTool);


我试过使用这个:

toolSystem["Gardening Tools"]["Line Trimmers"].Add(newTool);

但这导致了以下错误:

"object"不包含"Add"的定义,并且找不到接受"object"类型的第一个参数的可访问扩展方法"Add"(是否缺少using指令或程序集引用?(

您已经尝试使用字符串访问字典中的元素,使用类型化集合,这种语法可以工作,但问题是OrderedDictionary是非类型化的,因此元素的值被类型化为Object,因此您需要对其进行强制转换才能使用特定的索引器逻辑:

下面是一个简单的尝试,它显式地将各个元素强制转换为我们假设它们是的类型:

OrderedDictionary gardeningTools = (OrderedDictionary)toolSystem["Gardening Tools"];
ToolCollection lineTrimmers = (ToolCollection)gardeningTools["Line Trimmers"];
lineTrimmers.Add(newTool);

您可以将其作为单行执行:

(((OrderedDictionary)toolSystem["Gardening Tools"])["Line Trimmers"] as ToolCollection).Add(newTool);

OrderedDictionary
有两个索引器可以用来直接寻址字典中的项,上面的例子是使用Object类型的索引器,您可以以相同的方式使用整数索引器,

  • Item[Int32]返回Object
    获取或设置指定索引处的值。

  • Item[Object]返回Object
    获取或设置具有指定键的值。

在许多使用对象类型集合的情况下,我们这样做是因为我们希望改变每个单独元素的类型,如果这些元素都是相同的类型,我们通常会使用泛型或强类型集合。

我们应该避免养成显式强制转换值的习惯,因为它会在运行时抛出异常,我们现在可以使用类型测试模式匹配来检查特定类型,并在同一表达式中乐观地强制转换值:

if (toolSystem["Gardening Tools"] is OrderedDictionary gardeningTools)
{
if (gardeningTools["Line Trimmers"] is ToolCollection lineTrimmers)
{
lineTrimmers.Add(newTool);
}
}

这仍然可以简化为几乎一行:

if (toolSystem["Gardening Tools"] is OrderedDictionary gardeningTools
&& gardeningTools["Line Trimmers"] is ToolCollection lineTrimmers)
lineTrimmers.Add(newTool);

如果你知道元素的索引,你也可以使用它们:

int categorieIndex = 0;
int subTypeIndex = 0;
if (toolSystem[categorieIndex] is OrderedDictionary categorie
&& categorie[subTypeIndex] is ToolCollection subType)
subType.Add(newTool);

最新更新