gpt4 book ai didi

delphi - 如何从 Delphi 中的 TList<> 读取分组数据

转载 作者:行者123 更新时间:2023-12-02 06:51:40 25 4
gpt4 key购买 nike

在 C# Linq 中,这会变得非常简单,但我是在 Delphi 中使用列表的新手,我需要一些建议。

我有一个存储为 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

在 Delphi XE3(入门版)中执行此操作的最有效方法是什么?

最佳答案

最简单的是一组循环。使用 Delphi 的 DeHL 或 Spring 框架可能会稍微缩短您的代码,但不会太多。

This question关于使用条件查询通用 TList 实例提供了使用 Spring 框架中的集合的提示。

My example使用Integer而不是您的界面类型,但它应该很容易适应。

下面是两种拆分方法,具体取决于您是否希望每个列表以变化的值开始,或者仅针对不同的值(如 David 所说:万岁 TDictionary<Key, Value> )

我看到了区别,我把你的例子加倍了:

1, 1, 2, 2, 2, 2, 3, 4, 4, 4, 1, 1, 2, 2, 2, 2, 3, 4, 4, 4

第一个算法将返回这些:

1, 1
2, 2, 2, 2
3
4, 4, 4
1, 1
2, 2, 2, 2
3
4, 4, 4

第二个:

1, 1, 1, 1
2, 2, 2, 2, 2, 2, 2, 2
3, 3
4, 4, 4, 4, 4, 4

这是示例程序;只有打印需要嵌套循环。

program SplitListOfIntegersIntoSublists;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils,
System.Generics.Collections;

type
TIntegerList = TList<Integer>;
TIntegerListList = TList<TIntegerList>;
TMain = class(TObject)
private
class function AddNewIntegerList(IntegerListList: TIntegerListList): TIntegerList;
class procedure AddValues(AllIntegers: TIntegerList);
class procedure Fill_NewListForEachValueChange(const AllIntegers: TIntegerList; const IntegerListList: TIntegerListList);
class procedure Fill_NewListForDistinctValues(const AllIntegers: TIntegerList; const IntegerListList: TIntegerListList);
class procedure Free(const IntegerListList: TIntegerListList);
class procedure Print(const IntegerList: TIntegerList); overload;
class procedure Print(const IntegerListList: TIntegerListList); overload;
public
class procedure Run;
end;

class function TMain.AddNewIntegerList(IntegerListList: TIntegerListList): TIntegerList;
begin
Result := TIntegerList.Create;
IntegerListList.Add(Result);
end;

class procedure TMain.AddValues(AllIntegers: TIntegerList);
begin
// 1, 1, 2, 2, 2, 2, 3, 4, 4, 4
AllIntegers.Add(1);
AllIntegers.Add(1);
AllIntegers.Add(2);
AllIntegers.Add(2);
AllIntegers.Add(2);
AllIntegers.Add(2);
AllIntegers.Add(3);
AllIntegers.Add(4);
AllIntegers.Add(4);
AllIntegers.Add(4);
end;

class procedure TMain.Fill_NewListForEachValueChange(const AllIntegers: TIntegerList; const IntegerListList: TIntegerListList);
var
IntegerList: TIntegerList;
Value: Integer;
begin
for Value in AllIntegers do
begin
if (IntegerListList.Count = 0) or (Value <> IntegerList.First) then
IntegerList := AddNewIntegerList(IntegerListList);
IntegerList.Add(Value);
end;
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
IntegerListDictionary := TIntegerListDictionary.Create();
for Value in AllIntegers do
begin
if IntegerListDictionary.ContainsKey(Value) then
IntegerList := IntegerListDictionary[Value]
else
begin
IntegerList := AddNewIntegerList(IntegerListList);
IntegerListDictionary.Add(Value, IntegerList);
end;
IntegerList.Add(Value);
end;
end;

class procedure TMain.Free(const IntegerListList: TIntegerListList);
var
IntegerList: TIntegerList;
begin
for IntegerList in IntegerListList do
IntegerList.Free;
IntegerListList.Free;
end;

class procedure TMain.Print(const IntegerList: TIntegerList);
var
Value: Integer;
First: Boolean;
begin
First := True;
for Value in IntegerList do
begin
if not First then
Write(', ');
Write(Value);
First := False;
end;
Writeln;
end;

class procedure TMain.Print(const IntegerListList: TIntegerListList);
var
IntegerList: TIntegerList;
begin
for IntegerList in IntegerListList do
Print(IntegerList);
Writeln;
end;

class procedure TMain.Run;
var
AllIntegers: TIntegerList;
IntegerListList: TIntegerListList;
begin
AllIntegers := TIntegerList.Create();
try
AddValues(AllIntegers);
Print(AllIntegers);

IntegerListList := TIntegerListList.Create();
try
Fill_NewListForEachValueChange(AllIntegers, IntegerListList);
Print(IntegerListList);
finally
Free(IntegerListList);
end;

AddValues(AllIntegers);
Print(AllIntegers);

IntegerListList := TIntegerListList.Create();
try
Fill_NewListForEachValueChange(AllIntegers, IntegerListList);
Print(IntegerListList);
finally
Free(IntegerListList);
end;

Print(AllIntegers);

IntegerListList := TIntegerListList.Create();
try
Fill_NewListForDistinctValues(AllIntegers, IntegerListList);
Print(IntegerListList);
finally
Free(IntegerListList);
end;
finally
AllIntegers.Free;
end;
end;

begin
try
TMain.Run();
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

关于delphi - 如何从 Delphi 中的 TList<> 读取分组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com