2014-09-29 12 views
12

Tôi có một chức năng mà tôi lưu trữ một số cặp khóa-giá trị và khi tôi lặp lại chúng tôi nhận được lỗi này hai lần: [dcc32 Lỗi] App.pas (137): Lớp E2149 không có thuộc tính mặc định. Dưới đây là một phần của mã của tôi:Delphi TDictionary iteration

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; 

tôi cần phải thu thập các thông tin từ mỗi mục trong từ điển. Làm thế nào tôi có thể sửa chữa nó?

+2

'var S: string; Ghép nối: TPair ; bắt đầu cho Pair trong YourDictionary làm S: = Pair.Key + Pair.Value; kết thúc; ' – TLama

+1

Sử dụng' cho AKey trong requestContent.Keys bắt đầu request.Append (AKey + '=' + TIdURI.Encode (requestContent [AKey]) + '&'); ... vv'. Bạn phải khai báo 'AKey' là String, tất nhiên, –

+2

@RudyVelthuis Với từ điển, hầu như luôn luôn tốt hơn để lặp qua các cặp hơn các khóa. Làm như vậy lúc nào cũng dẫn đến mã hiệu quả hơn. Trong trường hợp của từ điển Delphi, trình lặp cặp tránh mọi tính toán băm –

Trả lời

25

Các thuộc tính KeysValues thuộc tính của lớp từ điển của bạn thuộc loại TDictionary<string, string>.TKeyCollectionTDictionary<string, string>.TValueCollection tương ứng. Các lớp này có nguồn gốc từ TEnumerable<T> và không thể được lặp lại theo chỉ mục. Tuy nhiên, bạn có thể lặp lại trên Keys hoặc thực sự là Values, chứ không phải việc thực hiện sau này sẽ có nhiều lợi ích cho bạn.

Nếu bạn lặp qua Keys mã của bạn có thể trông như thế này:

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

Tuy nhiên điều này là không hiệu quả. Vì bạn biết rằng bạn muốn cả giá trị khóa và giá trị khớp, bạn có thể sử dụng trình lặp của từ điển:

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

Trình lặp cặp hiệu quả hơn biến thể đầu tiên ở trên. Điều này là do các chi tiết thực hiện có nghĩa là cặp iterator có khả năng lặp lại các từ điển mà không cần:

  1. Tính mã băm cho mỗi phím, và
  2. Performing tuyến tính thăm dò khi mã băm va chạm.
Các vấn đề liên quan