Итерация 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) + '&');

Итератор пары более эффективен, чем первый вариант выше. Это связано с тем, что детали реализации означают, что итератор пары может выполнять итерацию словаря без:

  • Вычисление хэш-кодов для каждой клавиши и
  • Выполнение линейного зондирования при столкновении хэш-кодов.