我正在尝试建立每个ProductCode在我的数据库中使用次数的计数。问题是,我不知道所有代码是什么(或者可能添加更多代码)。
我假设我可以使用TList,使用值对(productCode和count)来做这样的事情(我试图将其视为一个List<>来自c#等)。
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;
这里有两件大事。
我该如何进行比较?或者有更好的方法来实现这一目标吗?
答案 0 :(得分:4)
您可以使用在构建期间传递给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);