如何在TList中找到记录的索引?

时间:2015-03-16 16:42:03

标签: delphi delphi-xe7

我正在尝试建立每个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;

这里有两件大事。

  1. 我不确定如何对indexOf的比较进行编码(如果这对于记录类型的TList来说甚至可能
  2. 列表项的更新很笨拙。
  3. 我该如何进行比较?或者有更好的方法来实现这一目标吗?

1 个答案:

答案 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);