我需要在Matlab中迭代一个COM集合。在VB中,我可以使用For Each item In Collection
;在Python中我可以使用for item in Collection
。但不幸的是,Matlab中没有这样的结构,它使用了一个简单的循环,如下所示:
for index = 1 : Collection.Count
item = Collection.Item(index);
% now do something useful with the item
end
这一般运作良好。但在我的特定集合中,.Item()
只接受一个字符串(项目的名称),而不是数字索引。所以上面的代码片段失败了,因为我在迭代循环之前不知道项目名称。
在VB中我可以做item = Collection(index)
,但这在Matlab中失败了,因为Matlab将其理解为" item是Collection number index"。换句话说,Collection(2)尝试访问第二个集合,而不是Collection中的第二个项目。这就是为什么我们通常在Matlab中使用.Item(index)
,但正如我上面所说,这在我的特定集合中失败,其中Item
只接受字符串。
所以我的问题是:我可以在没有foreach
构造或Item(index)
方法的情况下迭代COM集合吗?
答案 0 :(得分:0)
我可以告诉你如何在COM中完成它,但我不知道Matlab是否可以做到这一点。
有一个特殊属性DISPID_NEWENUM
,名称为_NewEnum
。检索此属性将获取IUnknown接口。您可以通过QueryInterface
获得IEnumVARIANT的界面。
所以简单地询问这个界面。然后调用Next方法并从枚举中通过VARIANT检索VARIANT,直到返回值不再是S_OK。通常在到达集合的末尾时返回S_FALSE。当我打电话给Next时,我总是使用1。
因此,如果MatLab可以使用除IDispatch之外的其他接口,那么它应该是可能的。