22

いくつかのキーと値のペアを保存する関数があり、それらを反復すると、次のエラーが 2 回発生します: [dcc32 エラー] 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;

辞書の各項目から情報を収集する必要があります。どうすれば修正できますか?

4

1 に答える 1

46

ディクショナリ クラスの プロパティと プロパティは、それぞれタイプがKeysandです。これらのクラスは、インデックスから派生しており、インデックスによって反復することはできません。ただし、 、または実際にを反復することはできますが、後者を実行してもあまり役に立ちません。ValuesTDictionary<string, string>.TKeyCollectionTDictionary<string, string>.TValueCollectionTEnumerable<T>KeysValues

コードを繰り返し処理すると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. ハッシュ コードが衝突したときに線形プローブを実行します。
于 2014-09-29T12:32:41.667 に答える