在没有foreach或.Item()

时间:2017-10-10 09:14:43

标签: vb.net matlab collections com

我需要在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集合吗?

1 个答案:

答案 0 :(得分:0)

我可以告诉你如何在COM中完成它,但我不知道Matlab是否可以做到这一点。

有一个特殊属性DISPID_NEWENUM,名称为_NewEnum。检索此属性将获取IUnknown接口。您可以通过QueryInterface获得IEnumVARIANT的界面。

所以简单地询问这个界面。然后调用Next方法并从枚举中通过VARIANT检索VARIANT,直到返回值不再是S_OK。通常在到达集合的末尾时返回S_FALSE。当我打电话给Next时,我总是使用1。

因此,如果MatLab可以使用除IDispatch之外的其他接口,那么它应该是可能的。