powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Энумераторы
13 сообщений из 13, страница 1 из 1
Энумераторы
    #39483926
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть класс такого вида
Код: pascal
1.
2.
3.
4.
5.
6.
7.
TMyClass = class
  FList1_1:TList;
  FList1_2:TList;
  FList1_3:TList;
  FList2:TList;
  FList3:TList;
end;

Хочу в цикле for-in пробежаться по всем элементам списков FList1_1, FList1_2, FList1_3. Написать энумератор не проблема. Проблема - как его создавать? Реализовать GetEnumeratorу самого TMyClass считаю не совсем правильным, т.к. класс хранит разные списки. Есть мысль создать фейковое поле и у него реализовать энумератор
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
TMyClass = class
  FList1_1:TList;
  FList1_2:TList;
  FList1_3:TList;
  FList1: TAggList;
  FList2:TList;
  FList3:TList;
end;

TAggList = class
  function GetEnumerator: TList1Enumerator;
end;

но идея мне не нравится. Может можно энумератор создать вручную? Типа такого
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  LClass: TMyClass;
  LObj: TObject;
begin
  for LObj in LClass.GetList1Enumerator do
    .........
end;


С уважением, Vasilisk
...
Рейтинг: 0 / 0
Энумераторы
    #39483936
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var

 e : TList1Enumerator;

begin

 e := LClass.List1.GetEnumerator;

 While e.MoveNext Do
  doSomething(e.Current);

end;


?
...
Рейтинг: 0 / 0
Энумераторы
    #39483939
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, можно, можно и рекордом на стеке для быстроты.

А что не так - пробовал?
...
Рейтинг: 0 / 0
Энумераторы
    #39483955
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey?Это понятно. Но это еще более громоздко чем с фейковым полем. Все портянки - пользователю кода
Bred eFeMА что не так - пробовал?Не понял фразы
...
Рейтинг: 0 / 0
Энумераторы
    #39483965
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, спрашиваю, что не получилось, если уже делал.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
TLinkList = class
 private type
  TBackEnum = record
   private
    fNext : PNode;
   public
   procedure Init(aList: TLinkList);
   function  GetCurrent: Pointer;
   function  MoveNext: Boolean;               inline;
   property  Current: Pointer read GetCurrent;
  end;
  TNodeEnum = record
   private
    fNext : PNode;
   public
   function  GetCurrent: PNode;               inline;
   function  GetEnumerator:TNodeEnum;         inline;
   procedure Init(aList: TLinkList);          inline;
   function  MoveNext: Boolean;               inline;
   property  Current: PNode read GetCurrent;
  end;
 TSafeEnum = class
  private
   fList : TLinkList;
   fNext : PNode;
   fCurr : PNode;
   constructor Create(aList: TLinkList);
  public
   destructor  Destroy; override;
   function  GetEnumerator: TSafeEnum;        inline;
   function  GetCurrent: Pointer;
   function  MoveNext: Boolean;               inline;
   property  Current: Pointer read GetCurrent;
  end;
 public
  function  GetEnumerator: TBackEnum;                          inline;
  function  Nodes: TNodeEnum;                                  inline;
  function  Safes: TSafeEnum;                                  inline;
..
function TLinkList.GetEnumerator: TBackEnum;
begin
 Result.Init(Self);
end;

..

for pNode in List.Nodes do ; 

...
Рейтинг: 0 / 0
Энумераторы
    #39483970
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Посмотри реализацию а Rapid.Generics. Или в стандартной Generics.Collections
...
Рейтинг: 0 / 0
Энумераторы
    #39483974
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Но это еще более громоздко чем с фейковым полем. Все портянки - пользователю кода
Тогда так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
//
TClass = Class

 Type

  TEnumerable = Record

   Type

    TEnumerator = Record
    End;

   Function GetEnumerator : TEnumerator;

  End;

 Property Enumerable : TEnumerable;

End;
//


Фейковый тип и свойство этого типа. Пользователь будет писать только:
Код: pascal
1.
for item in lclass.Enumerable do;
...
Рейтинг: 0 / 0
Энумераторы
    #39484026
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Энумераторы
    #39484046
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyТогда так:Спасибо. Так и сделал
...
Рейтинг: 0 / 0
Энумераторы
    #39484063
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger может здесь что полезное найдешь... С интерфейсами интересная идея
...
Рейтинг: 0 / 0
Энумераторы
    #39484068
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger может здесь что полезное найдешь...

+100500, сам в свое время запоем читал.
...
Рейтинг: 0 / 0
Энумераторы
    #39484113
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuperList:Array [0..4] of TList не подойдет? А в конструкторе можно задать FList1_1:=SuperList[0], FList1_2:=SuperList[1] и т.д.
...
Рейтинг: 0 / 0
Энумераторы
    #39485741
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010SuperList:Array [0..4] of TList не подойдет?Нет. У меня вложенные листы, на самом деле, принадлежат не самому классу, а его объектным полям. А один лист принадлежит самому классу. Вот все это хотелось перебрать одним циклом. Т.е. упростить такой код
Код: pascal
1.
2.
3.
4.
5.
6.
for i := 0 to MyList.Count - 1 do
  DoProcess(MyList[i]);
for i := 0 to Childs.Count - 1 do begin
  for j := 0 to Childs[i].List.Count - 1 do
    DoProcess(Childs[i].List[j]);
end;
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Энумераторы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]