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) + '&');

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

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