gpt4 book ai didi

delphi - 如何在 TList 中查找记录的索引?

转载 作者:行者123 更新时间:2023-12-03 15:52:02 26 4
gpt4 key购买 nike

我正在尝试统计每个 ProductCode 在我的数据库中使用的次数。问题是,我不知道所有代码是什么(或者可能会添加更多代码)。

我假设我可以使用带有值对(productCode 和 count)的 TList 来执行类似的操作(我试图将其视为来自 c# 的 List<> 等)

procedure myProc
type
TProductCodeCount = record
productCode : string;
count : integer;
end;
var
productCodes : TList<TProductCodeCount>;
newProductCodeCount : TProductCodeCount;
currProductCodeCount : TProductCodeCount;
currentProductCode : string;
productCodeIndex : integer;
begin
productCodes := TList<TProductCodeCount>.Create;

// Get my data set
// Loop through my data set
begin
currentProductCode := // value from the database ;
productCodeIndex := productCodes.indexOf(currentProductCode);
if productCodeIndex = -1 then
begin
newProductCodeCount.productCode := currentProductCode;
newProductCodeCount.count := 1;

productCodes.Add(newProductCodeCount)
end
else
begin
currProductCodeCount := productCodes.Extract(productCodeIndex);
currProductCodeCount.count := currProductCodeCount.count + 1'
productCodes.Delete(productCodeIndex);
productCodes.Add (currProductCodeCount);
end
end;

// Loop through my TList
begin
// do something with each productCode and count.
end
end;

这里有两个大问题。

  1. 我不确定如何编写比较代码以使indexOf工作(如果这对于记录类型的TList来说甚至是可能的)
  2. 列表项的更新很笨拙。

如何进行比较?或者有更好的方法来实现这一点吗?

最佳答案

您可以使用将传递给 TList<T> 的自定义比较器施工期间。

type
TProductCodeCountComparer = class(TComparer<TProductCodeCount>)
public
function Compare(const Left, Right: TProductCodeCount): Integer; override;
end;

function TProductCodeCountComparer.Compare(const Left, Right: TProductCodeCount): Integer;
begin
Result := CompareStr(Left.productCode, Right.productCode);
end;

var
Comparer: IComparer<TProductCodeCount>

Comparer := TProductCodeCountComparer.Create;
productCodes := TList<TProductCodeCount>.Create(Comparer);

您还可以就地创建比较器

  productCodes := TList<TProductCodeCount>.Create(
TComparer<TProductCodeCount>.Construct(
function (const Left, Right: TProductCodeCount): Integer
begin
Result := CompareStr(Left.productCode, Right.productCode);
end));

要就地编辑记录,您可以使用 TList<T>.List属性,让您可以直接访问底层 TList<T>数组并允许您直接修改列表中的记录:

var
productCodes: TList<TProductCodeCount>;
....
inc(productCodes.List[productCodeIndex].count);

TList<T>.List属性是在 XE3 中引入的,对于早期的 Delphi 版本,以下类扩展允许就地记录修改:

  TXList<T> = class(TList<T>)
protected type
PT = ^T;
function GetPItem(index: Integer): PT;
public
property PItems[index: Integer]: PT read GetPItem;
end;

function TXList<T>.GetPItem(index: Integer): PT;
begin
Result := @FItems[index];
end;

var
productCodes: TXList<TProductCodeCount>;
....
inc(productCodes.PItems[productCodeIndex].count);

关于delphi - 如何在 TList 中查找记录的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29082302/

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