2014-11-20 5 views
3

Предоставляет ли Delphi хороший способ перебора элементов TCollectionItems в TCollection?для всех/для каждого цикла через Delphi TCollection?

Что-то, возможно, вдоль линий ...

for mycollectionitem in mycollection.Items do 
    mycollectionitem.setWhatever(); 

Это не компилируется, хотя

или не есть на самом деле я ничего не могу сделать это более элегантно, чем это:

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

Если вам нужно использовать классический цикл for-to, я бы написал 'для num: = 0 для mycollection.Count - 1 do', просто говоря. –

+1

Какая версия delphi? Какова ошибка компилятора, с которой вы сталкиваетесь? –

ответ

5

For..in Петли реализованы как вызовы GetEnumerator и методы возвращаемой переменной. Свойство Items - это не объект, а свойство массива, которое тихо отображает пару геттер/сеттер, поэтому он не может вернуть перечислитель, но сам TCollection имеет метод GetEnumerator.

Таким образом:

for mycollectionitem in mycollection do 
    mycollectionitem.setWhatever(); 

Имейте в виду, однако, что TCollection не является универсальным классом, поэтому тип переменной индекса переписчик будет TCollectionItem, а не то, что ItemClass вы работаете с.

+2

Также имейте в виду, что 'for..in' был представлен в Delphi 2007, поэтому он не будет работать для более старых версий. –

+0

@Remy: Да, но, учитывая, что OP использует синтаксис 'for..in' в этом примере, разумно предположить, что он работает с версией, которая его поддерживает. –

+1

OP * хочет * использовать синтаксис 'for..in'. Это не значит, что он на самом деле * имеет * версию Delphi, которая поддерживает 'for..in' петли. Некоторые другие языки имеют аналогичный синтаксис 'in..in', поэтому он может просто спекулировать. Он не сказал ничего, что намекает на версию Delphi, которую он использует. –