Delphi TDictionary, итерация
У меня есть функция, в которой я храню несколько пар ключ-значение, и когда я их повторяю, я получаю эту ошибку дважды: [dcc32 Error] App.pas(137): E2149 Class не имеет свойства по умолчанию. Вот часть моего кода:
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) + '&');
Парный итератор более эффективен, чем первый вариант выше. Это связано с тем, что детали реализации означают, что парный итератор может выполнять итерацию словаря без:
- Вычисление хеш-кодов для каждого ключа и
- Выполнение линейного зондирования при столкновении хеш-кодов.