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

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

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