Коллекции представляют собой совокупность объектов одного или разных типов. Использование коллекций позволяет в программе единым образом обрабатывать каждый объект, который в них входит. В языке Fore коллекции реализованы в сборке Collections, в Fore.NET используются коллекции из пространства имён System.Collections (mscorlib.dll) или сборки ForeCollections, которая является аналогом Fore-сборки Collections. Если одновременно используется System.Collections и ForeCollections, то необходимо использовать полностью квалифицированные идентификаторы классов.
Функциональность коллекций этих сборок покрывает большинство имеющихся задач. При необходимости может быть создана собственная коллекция, в которой могут быть переопределены свойства/методы какой-либо базовой коллекции, а также реализованы необходимые дополнительные возможности.
Для обработки коллекций используются различные циклы, доступные в Fore/Fore.NET.
Sub UserProc;
Var
Arr: IArrayList;
Begin
Arr := New ArrayList.Create;
// Добавление элементов в коллекцию
Arr.Add("A");
Arr.Add("D");
Arr.Add("G");
Arr.Add("C");
Arr.Add("B");
// Просмотр коллекции до каких-либо действий
Debug.WriteLine("---До каких-либо действий---");
ShowCollection(Arr);
// Сортировка
Arr.Sort(Comparer.StringComparer);
Debug.WriteLine("---После сортировки---");
ShowCollection(Arr);
// Обратный порядок в коллекции
Arr.Reverse;
Debug.WriteLine("---Переворот в обратном порядке---");
ShowCollection(Arr);
// Поиск элемента в коллекции
Debug.WriteLine("Индекс элемента G:" + Arr.IndexOf("G").ToString);
End Sub UserProc;
Sub ShowCollection(Collection: IEnumerable);
Var
v: Variant;
Begin
For Each v In Collection Do
Debug.Write(v + " ");
End For;
Debug.WriteLine("");
End Sub ShowCollection;
Imports System.Collections;
Public Shared Sub Main(Params: StartParams);
Var
Arr: ArrayList;
Begin
Arr := New ArrayList();
// Добавление элементов в коллекцию
Arr.Add("A");
Arr.Add("D");
Arr.Add("G");
Arr.Add("C");
Arr.Add("B");
// Просмотр коллекции до каких-либо действий
System.Diagnostics.Debug.WriteLine("---До каких-либо действий---");
ShowCollection(Arr);
// Сортировка
Arr.Sort(StringComparer.InvariantCulture);
System.Diagnostics.Debug.WriteLine("---После сортировки---");
ShowCollection(Arr);
// Обратный порядок в коллекции
Arr.Reverse();
System.Diagnostics.Debug.WriteLine("---Переворот в обратном порядке---");
ShowCollection(Arr);
// Поиск элемента в коллекции
System.Diagnostics.Debug.WriteLine("Индекс элемента G:" + Arr.IndexOf("G").ToString());
End Sub;
Shared Sub ShowCollection(Collection: IEnumerable);
Var
o: Object;
Begin
For Each o In Collection Do
System.Diagnostics.Debug.Write(o + " ");
End For;
System.Diagnostics.Debug.WriteLine("");
End Sub;
Пример создания собственной коллекции, которая расширяет системную коллекцию ArrayList. При добавлении элементов в коллекцию для каждого элемента также будет генерироваться уникальный GUID:
Sub UserProc;
Var
m: MyCollections;
v: Array;
i: Integer;
Begin
m := New MyCollections.Create;
// Добавление элементов в коллекцию
m.Add("Первая строка");
m.Add("Вторая строка");
m.Add(100500);
For i := 0 To m.Count - 1 Do
v := m.Item(i);
Debug.WriteLine("Значение: " + v[0] + ". GUID: " + v[1]);
End For;
End Sub UserProc;
// Собственная коллекция на базе коллекции ArrayList
Class MyCollections: ArrayList
_Array: IArrayList;
_Guid: IArrayList;
i: Integer;
Public Constructor Create;
Begin
_Array := New ArrayList.Create;
_Guid := New ArrayList.Create;
End Constructor Create;
// Переопределение необходимых свойств и методов
Public Function Add(Obj: Variant): Integer;
Begin
_Array.Add(Obj);
Return (_Guid.Add(GuidGenerator.Generate));
End Function Add;
Public Property Count: Integer
Get
Begin
Return _Array.Count;
End Get
End Property Count;
Public Property Item(Index: Integer): Array
Get
Var
_Arr: Array;
Begin
If Index < _Array.Count Then
_Arr := New Variant[2];
_Arr[0] := _Array.Item(Index);
_Arr[1] := _Guid.Item(Index);
Return _Arr;
Else
Return Null
End If;
End Get
End Property Item;
End Class MyCollections;
Imports System.Collections;
Public Shared Sub Main(Params: StartParams);
Var
m: MyCollections;
v: Array;
i: Integer;
Begin
m := New MyCollections();
// Добавление элементов в коллекцию
m.Add("Первая строка");
m.Add("Вторая строка");
m.Add(100500);
// Просмотр сформированной коллекции
For i := 0 To m.Count - 1 Do
v := m.Item[i];
System.Diagnostics.Debug.WriteLine("Значение: " + v[0] + ". GUID: " + v[1]);
End For;
End Sub;
// Собственная коллекция на базе коллекции ArrayList
Class MyCollections: ArrayList
_Array: ArrayList;
_Guid: ArrayList;
i: Integer;
Public Constructor Create();
Begin
_Array := New ArrayList();
_Guid := New ArrayList();
End Constructor;
// Переопределение необходимых свойств и методов
New Public Function Add(Obj: Object): Integer;
Begin
_Array.Add(Obj);
Return (_Guid.Add(Guid.NewGuid()));
End Function;
New Public Property Count: Integer
Get
Begin
Return _Array.Count;
End Get
End Property;
New Public Property Item[Index: Integer]: Array
Get
Var
_Arr: Array;
Begin
If Index < _Array.Count Then
_Arr := New Object[2];
_Arr[0] := _Array.Item[Index];
_Arr[1] := _Guid.Item[Index];
Return _Arr;
Else
Return Null
End If;
End Get
End Property;
End Class;
В различных сборках среды разработки реализованы системные коллекции, которые предназначены для работы с определёнными группами объектов. В названиях коллекций на конце добавлена буква «s». Отдельные элементы коллекций описываются интерфейсами, названия которых совпадают с названием коллекции, но в конце отсутствует буква «s». Например: IMetabaseObjectDescriptors - коллекция описаний объектов и IMetabaseObjectDescriptor - описание одного объекта; ITreeListNodes - коллекция элементов дерева и ITreeListNode - один элемент дерева.
Работа со всеми системными коллекциями однотипна, поэтому, созданный для обработки одной коллекции код, может быть быстро адаптирован для обработки какой-либо другой коллекции. В коллекциях имеется следующие общие свойства и методы:
Count - возвращает количество объектов в коллекции;
Item - предоставляет доступ к элементу коллекции по индексу;
Find или его модификации - позволяет производить поиск объектов в коллекции по какому-либо признаку.
Если коллекции являются расширяемые, то в них имеются следующие общие методы:
Add или его модификации - позволяют добавить в коллекцию новые объекты;
Remove или его модификации - позволяют удалять объекты из коллекции по определённому признаку;
Clear - позволяет очистить коллекцию целиком.
Для выполнения следующего примера потребуется форма, расположенная на ней кнопка с наименованием Button1 и компонент TreeList с наименованием TreeList1. Код является обработчиком события щелчка мыши по кнопке.
Sub Button1OnClick(Sender: Object; Args: IMouseEventArgs);
Var
MB: IMetabase;
MDescs: IMetabaseObjectDescriptors;
MDesc: IMetabaseObjectDescriptor;
Nodes: ITreeListNodes;
Node: ITreeListNode;
i, k: Integer;
Begin
MB := MetabaseClass.Active;
// Коллекция описаний объектов, расположенных в корневой папке репозитория
MDescs := MB.Root.Children;
// Коллекция элементов компонента TreeList
Nodes := TreeList1.Nodes;
k := MDescs.Count;
For i := 0 To k - 1 Do
// Получение описания объекта по индексу
MDesc := MDescs.Item(i);
// Создание в дереве элемента, соответствующего объекту репозитория
Node := Nodes.Add(Null, MDesc.Id);
Node.Data := MDesc;
End For;
End Sub Button1OnClick;
Private Sub button1_Click(sender: System.Object; e: System.EventArgs);
Var
MB: IMetabase;
MDescs: IMetabaseObjectDescriptors;
MDesc: IMetabaseObjectDescriptor;
Nodes: ITreeListNodes;
Node: ITreeListNode;
i, k: Integer;
Begin
MB := Self.Metabase;
// Коллекция описаний объектов, расположенных в корневой папке репозитория
MDescs := MB.Root.Children;
// Коллекция элементов компонента TreeList
Nodes := TreeListNet1.CtrlBox.Nodes;
k := MDescs.Count;
For i := 0 To k - 1 Do
// Получение описания объекта по индексу
MDesc := MDescs.Item[i];
// Создание в дереве элемента, соответствующего объекту репозитория
Node := Nodes.Add(Null, MDesc.Id);
Node.Data := MDesc;
End For;
End Sub;
Большинство системных коллекций поддерживают работу в цикле For Each:
Var
//...
MDescs: IMetabaseObjectDescriptors;
MDesc: IMetabaseObjectDescriptor;
//...
Begin
//...
For Each MDesc In MDescs Do
//...
// Работа с описанием отдельного объекта
//...
End For;
См. также: