Я создал оболочку для динамического массива RTTI.
Это всего лишь первый набросок, но он был вдохновлен вашим вопросом и тем фактом, что методы TList
отсутствуют.
type
TGroup: array of integer;
var
Group: TGroup;
GroupA: TDynArray;
i, v: integer;
begin
GroupA.Init(TypeInfo(TGroup),Group); // associate GroupA with Group
for i := 0 to 1000 do begin
v := i+1000; // need argument passed as a const variable
GroupA.Add(v);
end;
v := 1500;
if GroupA.IndexOf(v)<0 then // search by content
ShowMessage('Error: 1500 not found!');
for i := GroupA.Count-1 downto 0 do
if i and 3=0 then
GroupA.Delete(i); // delete integer at index i
end;
Эта оболочка TDynArray
будет работать также с массивом строк или массивов записей ... Записи должны быть только упакованы и иметь только поля со счетчиком ссылок (байтов, целых, двойных ...) или ссылки на строки-counts поля (без Variant или Interface внутри).
Метод IndexOf () будет искать по содержимому.Например, для массива записей все поля записей (включая строки) должны совпадать.
См. TDynArray
в единицу SynCommons.pas из нашего репозитория исходного кода.Работает с Delphi 6 до XE и обрабатывает строки Unicode.
А метод TTestLowLevelCommon._TDynArray
- это автоматические унитарные тесты, связанные с этой оболочкой.Здесь вы найдете примеры массивов записей и более продвинутых функций.
В настоящее время я реализую методы SaveToStream
и LoadToStream
...
Возможно, новый способ использованияобщие функции во всех версиях Delphi.
Редактировать:
Я добавил несколько новых методов в запись / объект TDynArray
:
- теперь вы можете сохранять и загружать содержимое динамического массива в строку или из строки (используя методы
LoadFromStream/SaveToStream
или LoadFrom/SaveTo
) - она будет использовать собственную, но очень быструю структуру двоичного потока; - иВы можете отсортировать содержимое динамического массива двумя способами: либо на месте (т. е. обмениваться содержимым элементов массива), либо с помощью внешнего поискового массива целочисленных индексов (используя метод
CreateOrderedIndex
- в этом случае вы можете иметь несколькозаказы на те же данные); - вы можете указать любую пользовательскую функцию сравнения, и есть новый метод
Find
, который может использовать быстрый бинарный поиск, если он доступен.
Здеськак работают эти новые методы:
var
Test: RawByteString;
...
Test := GroupA.SaveTo;
GroupA.Clear;
GroupA.LoadFrom(Test);
GroupA.Compare := SortDynArrayInteger;
GroupA.Sort;
for i := 1 to GroupA.Count-1 do
if Group[i]<Group[i-1] then
ShowMessage('Error: unsorted!');
v := 1500;
if GroupA.Find(v)<0 then // fast binary search
ShowMessage('Error: 1500 not found!');
Все ещеближе к общей парадигме, быстрее и для Delphi 6 вплоть до XE ...