2014-09-29 9 views
12

Mam funkcję, w której przechowuje się parę par klucz-wartość i kiedy I iteracji ich otrzymuję ten błąd dwa razy: [błąd dcc32] App.pas (137): E2149 Klasa nie ma właściwości domyślnej. Tutaj jest częścią mojego kodu:Delphi TDictionary iteracja

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; 

muszę zebrać informacje z każdej pozycji w słowniku. Jak mogę to naprawić?

+2

'var S: string; Para: TPair <łańcuch, ciąg>; rozpocząć dla Pair in YourDictionary do S: = Pair.Key + Pair.Value; end; ' – TLama

+1

Użyj' dla AKey w requestContent.Keys zacznij request.Append (AKey + '=' + TIdURI.Encode (requestContent [AKey]) + '&'); ... itd. Musisz zadeklarować 'AKey' jako Ciąg znaków, oczywiście, –

+2

@RudyVelthuis W słownikach, prawie zawsze lepiej jest powtarzać nad parami niż nad klawiszami, co nieodmiennie przekłada się na bardziej efektywny kod.W przypadku słownika Delphi iterator pary unika potrzeby obliczania skrótu kody i przeprowadź sondowanie –

Odpowiedz

25

Właściwości twojej klasy słownikowej to odpowiednio TDictionary<string, string>.TKeyCollection i TDictionary<string, string>.TValueCollection. Klasy te pochodzą z TEnumerable<T> i nie można ich modyfikować za pomocą indeksu. Możesz jednak iterować ponad Keys, a nawet Values, nie żeby to drugie miało dla ciebie duże znaczenie.

Jeśli potwierdziło ponad Keys kod może wyglądać następująco:

var 
    Key: string; 
.... 
for Key in requestContent.Keys do 
    request.Append(Key + '=' + TIdURI.URLEncode(requestContent[Key]) + '&'); 

To jednak jest nieskuteczny. Skoro wiesz, że chcesz zarówno wartość klucza i dopasowanie, można użyć iterację słownika użytkownika:

var 
    Item: TPair<string, string>; 
.... 
for Item in requestContent do 
    request.Append(Item.Key + '=' + TIdURI.URLEncode(Item.Value) + '&'); 

Para iterator jest bardziej wydajny niż w pierwszym wariancie powyżej. To dlatego, że szczegóły implementacji oznacza, że ​​iterator para jest w stanie iteracyjne bez słownika:

  1. Obliczanie kody hash dla każdego klucza, a
  2. widowiskowej liniowy próbkowania kiedy kody hash zderzają.