Эффективное группирование данных в TList<> на Delphi: пример со списком целых чисел
Работа с коллекциями данных в Delphi может быть не такой интуитивно понятной, как в C# с использованием Linq, особенно для новичков. Вопрос, поднятый пользователем, заключается в необходимости группировки элементов списка TList<IMyInterface> так, чтобы каждый элемент был представлен как подсписок, где все элементы внутри одного подсписка имеют одно и то же значение. Например, изначальный список 1, 1, 2, 2, 2, 2, 3, 4, 4, 4 должен быть преобразован в новый список TList<TList<IMyInterface>>, где элементы сгруппированы так: 1, 1, 2, 2, 2, 2, 2, 3, 4, 4, 4.
Подходы к решению
Существуют различные способы решения этой задачи, включая использование словарей (TDictionary) для сбора групп. Однако, как отмечают пользователи, в Delphi нет ничего "так же круто", как Linq в C#. Тем не менее, использование циклов является эффективным способом достижения цели.
Пример решения
В качестве подтвержденного ответа приводится пример программы, которая демонстрирует два метода группировки: первый метод создает новые подсписки для каждого изменения значения, второй - только для уникальных значений. Пример написан на Object Pascal и использует классы TIntegerList и TIntegerListList для работы со списками целых чисел.
program SplitListOfIntegersIntoSublists;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Generics.Collections;
type
TIntegerList = TList<Integer>;
TIntegerListList = TList<TIntegerList>;
TMain = class(TObject)
// ...
end;
class function TMain.AddNewIntegerList(IntegerListList: TIntegerListList): TIntegerList;
begin
Result := TIntegerList.Create;
IntegerListList.Add(Result);
end;
class procedure TMain.AddValues(AllIntegers: TIntegerList);
// ...
class procedure TMain.Fill_NewListForEachValueChange(const AllIntegers: TIntegerList; const IntegerListList: TIntegerListList);
var
IntegerList: TIntegerList;
Value: Integer;
begin
// ...
end;
class procedure TMain.Fill_NewListForDistinctValues(const AllIntegers: TIntegerList; const IntegerListList: TIntegerListList);
type
TIntegerListDictionary = TDictionary<Integer, TIntegerList>;
var
IntegerListDictionary: TIntegerListDictionary;
IntegerList: TIntegerList;
Value: Integer;
begin
// ...
end;
class procedure TMain.Print(const IntegerList: TIntegerList);
// ...
class procedure TMain.Run;
var
AllIntegers: TIntegerList;
IntegerListList: TIntegerListList;
begin
// ...
end;
begin
// ...
end.
Примечания
Приведенный пример содержит методы для заполнения списков, а также для печати результатов. Важно также обратить внимание на корректное освобождение памяти, чтобы избежать утечек.
Заключение
Приведенный пример демонстрирует, как можно эффективно группировать данные в TList<>, используя простые алгоритмы на Delphi. Важно помнить о необходимости освобождения ресурсов, особенно при работе с большими объемами данных.
Пример группировки элементов списка `TList<> в подсписки по одинаковым значениям на Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.