如何在记录数组中按字段查找特定记录

时间:2011-03-11 14:41:55

标签: delphi

我知道这可能是一个基本问题但是这里有。 我有一个const数组记录定义:

  TDocumentKindInfo = record

    Employee: integer;
    First: string;
    Last: string;
    Title: string;
  end;

const
  CDocumentKindInfos: array[TDocumentKind] of TDocumentKindInfo = (

    (Emplyee: 1; First: 'Bob'; Last: 'Fredricks'; Title: 'Manager'),
    (Emplyee: 2; First: 'Bill'; Last: 'Evans'; Title: 'Cashier'),
    (Emplyee: 3; First: 'Jill'; Last: 'Dunne'; Title: 'Stocker'),
...

如何找到作为经理的员工姓名。我环顾四周,找不到任何有帮助的东西。我是delphi的初学者。使用delphi 7。

3 个答案:

答案 0 :(得分:6)

我通常会这样写:

function FindDocumentByTitle(const Title: string): TDocumentKind;
begin
  for Result := low(Result) to high(Result) do
    if SameText(Title, CDocumentKindInfos[Result].Title) then
      exit;
  raise EDocumentNotFound.CreateFmt('Document titled ''%s'' not found.', [Title]);
end;      

如果找不到任何项目,该函数会引发错误。很快你就会想把所有这些都包括在课堂上。

答案 1 :(得分:2)

试试这段代码

for I:= Low(CDocumentKindInfos) to high(CDocumentKindInfos) do
begin
  if CDocumentKindInfos[I].Title = 'Manager' then
  begin
    ShowMessage('Employee name is ' + CDocumentKindInfos[I].Employee);
    Break;
  end;
end;

答案 2 :(得分:0)

我意识到这个问题已经有3年了,但我想我会补充答案。

当迭代记录数组时,我经常编码如下:

type  TData = record
        Points: Integer;
        Count:  Cardinal;
        flags:  Cardinal;
      end;
      PData = ^Data;
      TDataArray = array of TData
      PDataArray = ^TDataArray
...
var   LongNameForSomeNouns: TDataArray
      Noun:  PData;         //pointer to the current Record
      iNoun: Integer;
...
  for iNoun:=Low(LongNameForSomeNouns) to High(LongNameForSomeNouns) do begin
    Noun := @LongNameForSomeNouns[iNoun];
    Noun.Points := 5;
    Inc(Noun.Count);
    SomeFunction(Noun);
  end;

我想提出三点:

  1. 我很少使用i作为迭代器。太无意义了。相反,我使用i作为短期的前缀(意思是迭代器),提醒我正在迭代的内容。这样一些错误如'SomeVerbs [iNoun]'变得明显。

  2. 使用像Noun这样的中间变量作为记录指针,可以压缩我的代码,而不会出现'With'的恶意。嵌套此类循环时,请使用单独的迭代器和记录指针。

  3. 将记录指针作为参数传递意味着Delphi永远不会复制记录。这也意味着接收功能可以修改记录。如果要传递副本,可以明确地这样做。

  4. 最后,为什么要使用Records而不是Objects?性能。指向指针之后会导致缓存抖动,从而导致性能下降。对象数组实际上是指向对象的指针数组。每个间接层都强制CPU将不同的内存行调用到缓存中,这会使CPU停顿。它比只有一个固定的小缓存要糟糕得多。您的CPU具有少量缓存行。

    是的,这仅适用于某些类型的程序,并且仅在分析之后。但是通过关注这样的事情,我的速度提高了50-100倍。过去需要一周时间处理10M数据库记录的程序现在可以在一夜之间完成。它曾经是CPU绑定的,它现在完全是数据库IO绑定的。