我知道这可能是一个基本问题但是这里有。 我有一个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。
答案 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;
我想提出三点:
我很少使用i作为迭代器。太无意义了。相反,我使用i作为短期的前缀(意思是迭代器),提醒我正在迭代的内容。这样一些错误如'SomeVerbs [iNoun]'变得明显。
使用像Noun这样的中间变量作为记录指针,可以压缩我的代码,而不会出现'With'的恶意。嵌套此类循环时,请使用单独的迭代器和记录指针。
将记录指针作为参数传递意味着Delphi永远不会复制记录。这也意味着接收功能可以修改记录。如果要传递副本,可以明确地这样做。
最后,为什么要使用Records而不是Objects?性能。指向指针之后会导致缓存抖动,从而导致性能下降。对象数组实际上是指向对象的指针数组。每个间接层都强制CPU将不同的内存行调用到缓存中,这会使CPU停顿。它比只有一个固定的小缓存要糟糕得多。您的CPU具有少量缓存行。
是的,这仅适用于某些类型的程序,并且仅在分析之后。但是通过关注这样的事情,我的速度提高了50-100倍。过去需要一周时间处理10M数据库记录的程序现在可以在一夜之间完成。它曾经是CPU绑定的,它现在完全是数据库IO绑定的。