遍历Delphi TCollection的每个元素?

3
Delphi是否提供一种遍历TCollection中TCollectionItems的好方法?类似于以下内容:
for mycollectionitem in mycollection.Items do
  mycollectionitem.setWhatever();

不过,这样并不能编译通过。

还有没有更优雅的解决方案呢?

for num := 1 to mycollection.Count do
  mycollection.Items[num-1].setWhatever();

如果你必须使用经典的for-to循环,我会写成for num := 0 to mycollection.Count - 1 do,仅供参考。 - Stefan Glienke
1
你使用的Delphi版本是哪个?你遇到了什么编译器错误? - David Heffernan
1个回答

6
For..in循环被实现为调用GetEnumerator和返回的变量方法。 Items属性不是一个对象,而是一个数组属性,它静默地映射到getter/setter对,因此它无法返回枚举器,但TCollection本身确实有一个GetEnumerator方法。

因此:
for mycollectionitem in mycollection do
   mycollectionitem.setWhatever();

请注意,TCollection不是一个通用类,因此枚举器索引变量的类型将是TCollectionItem,而不是您正在使用的任何ItemClass


2
请注意,for..in是在Delphi 2007中引入的,因此它不适用于旧版本。 - Remy Lebeau
@Remy:是的,但考虑到 OP 在示例中使用了 for..in 语法,可以合理地假设他正在使用支持它的版本。 - Mason Wheeler
1
OP希望使用for..in语法。这并不意味着他实际上拥有支持for..in循环的Delphi版本。其他一些语言具有类似的for..in语法,因此他可能只是在推测。他没有说任何暗示他正在使用哪个Delphi版本的话。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接