我喜欢 Linas 提出的用法示例的语法,但由于该函数无法正常工作,这里有一个更正的版本。FindIn 不使用快速定位的事实不是问题,因为它仅用于迭代(DMultiMap 是有序映射,因此具有相同键的所有项目都在一起):
function IterateOverFound(Map: DMultiMap; var iter: DIterator; const obj: array of const): Boolean;
var bWasToKey: boolean;
begin
if diIteration in iter.flags then
begin
advance(iter);
bWasToKey := diKey in iter.flags;
SetToKey(iter);
iter := DeCAL.findIn(iter, DeCAL.getContainer(iter).finish, obj);
if not bWasToKey then
SetToValue(iter);
end else
begin
iter := Map.locate(obj);
Include(iter.flags, diIteration);
end;
result := not atEnd(iter);
if not result then
Exclude(iter.flags, diIteration);
end;
示例用法:
var
map: DMultiMap;
iter: DIterator;
map := DMultiMap.Create;
map.putPair(['aaa', 0]);
map.putPair(['def', 1]);
map.putPair(['abc', 2]);
map.putPair(['abc', 3]);
map.putPair(['def', 4]);
map.putPair(['abc', 5]);
map.putPair(['def', 6]);
iter := map.start;
while IterateOverFound(map, iter, ['abc']) do
begin
// do something with the value...
end;