Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Энумераторы / 13 сообщений из 13, страница 1 из 1
06.07.2017, 15:56:40
    #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
06.07.2017, 16:12:37
    #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
06.07.2017, 16:15:01
    #39483939
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Энумераторы
_Vasilisk_, можно, можно и рекордом на стеке для быстроты.

А что не так - пробовал?
...
Рейтинг: 0 / 0
06.07.2017, 16:26:39
    #39483955
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Энумераторы
Kazantsev Alexey?Это понятно. Но это еще более громоздко чем с фейковым полем. Все портянки - пользователю кода
Bred eFeMА что не так - пробовал?Не понял фразы
...
Рейтинг: 0 / 0
06.07.2017, 16:42:05
    #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
06.07.2017, 16:48:22
    #39483970
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Энумераторы
_Vasilisk_,

Посмотри реализацию а Rapid.Generics. Или в стандартной Generics.Collections
...
Рейтинг: 0 / 0
06.07.2017, 16:53:50
    #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
06.07.2017, 17:40:40
    #39484026
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Энумераторы
...
Рейтинг: 0 / 0
06.07.2017, 18:03:01
    #39484046
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Энумераторы
Kazantsev AlexeyТогда так:Спасибо. Так и сделал
...
Рейтинг: 0 / 0
06.07.2017, 18:27:15
    #39484063
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Энумераторы
white_nigger может здесь что полезное найдешь... С интерфейсами интересная идея
...
Рейтинг: 0 / 0
06.07.2017, 18:30:05
    #39484068
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Энумераторы
white_nigger может здесь что полезное найдешь...

+100500, сам в свое время запоем читал.
...
Рейтинг: 0 / 0
06.07.2017, 21:01:16
    #39484113
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Энумераторы
SuperList:Array [0..4] of TList не подойдет? А в конструкторе можно задать FList1_1:=SuperList[0], FList1_2:=SuperList[1] и т.д.
...
Рейтинг: 0 / 0
10.07.2017, 13:37:09
    #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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Энумераторы / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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