Итерация Delphi TDictionary
У меня есть функция, где я храню некоторые пары ключ-значение, и когда я повторяю их, я получаю эту ошибку дважды: [dcc32 Error] App.pas (137): класс E2149 не имеет свойства по умолчанию. Вот часть моего кода:
function BuildString: string;
var
i: Integer;
requestContent: TDictionary<string, string>;
request: TStringBuilder;
begin
requestContent := TDictionary<string, string>.Create();
try
// add some key-value pairs
request := TStringBuilder.Create;
try
for i := 0 to requestContent.Count - 1 do
begin
// here I get the errors
request.Append(requestContent.Keys[i] + '=' +
TIdURI.URLEncode(requestContent.Values[i]) + '&');
end;
Result := request.ToString;
Result := Result.Substring(0, Result.Length - 1); //remove the last '&'
finally
request.Free;
end;
finally
requestContent.Free;
end;
end;
Мне нужно собрать информацию с каждого элемента в словаре. Как я могу это исправить?
1 ответов
на Keys
и Values
свойства вашего класса словаря имеют тип TDictionary<string, string>.TKeyCollection
и TDictionary<string, string>.TValueCollection
соответственно. Эти классы являются производными от TEnumerable<T>
и не может быть проход по индексу. Однако вы можете перебирать Keys
или Values
, не то, чтобы последнее было вам полезно.
если вы перебрали Keys
ваш код может выглядеть так:
var
Key: string;
....
for Key in requestContent.Keys do
request.Append(Key + '=' + TIdURI.URLEncode(requestContent[Key]) + '&');
это, однако, неэффективно. Так как вы знаете, что вы хотите и ключ и соответствие значение, вы можете использовать итератор словаря:
var
Item: TPair<string, string>;
....
for Item in requestContent do
request.Append(Item.Key + '=' + TIdURI.URLEncode(Item.Value) + '&');
итератор пары более эффективен, чем первый вариант выше. Это связано с тем, что детали реализации означают, что итератор пары может выполнять итерацию словаря без:
- вычисление хэш-кодов для каждого ключа, и
- выполнение линейного зондирования при столкновении хэш-кодов.