2014-09-29 13 views
12

मेरे पास एक ऐसा कार्य है जहां मैं कुछ कुंजी-मूल्य जोड़े संग्रहीत करता हूं और जब मैं उन्हें पुन: सक्रिय करता हूं तो मुझे यह त्रुटि दो बार मिलती है: [dcc32 त्रुटि] App.pas (137): E2149 कक्षा में डिफ़ॉल्ट संपत्ति नहीं है।डेल्फी TDictionary पुनरावृत्ति

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; 

मैं शब्दकोश में प्रत्येक आइटम से जानकारी एकत्र की जरूरत है: यहाँ मेरी कोड का हिस्सा है। मेरे द्वारा यह कैसे किया जा सकता है?

+2

'var S: string; जोड़ी: टीपीएआर <स्ट्रिंग, स्ट्रिंग>; YourDictionary में जोड़े के लिए शुरू करें एस: = जोड़ी। के + जोड़े। वैल्यू; अंत; ' – TLama

+1

अनुरोध में AKey के लिए 'सामग्री का उपयोग करें। केंट्स अनुरोध शुरू करें। ऐपेंड (AKey +' = '+ TIdURI.Encode (requestContent [AKey]) +' &'); ... आदि '। आपको' AKey' घोषित करना होगा स्ट्रिंग, ज़ाहिर है। –

+2

@RudyVelthuis शब्दकोशों के साथ, चाबियों की तुलना में जोड़ों पर फिर से शुरू करना लगभग हमेशा बेहतर होता है। ऐसा करने के लिए हमेशा अधिक कुशल कोड होते हैं। डेल्फी शब्दकोश के मामले में, जोड़ी इटेटरेटर हैश की गणना करने की किसी भी आवश्यकता से बचाता है कोड, और जांच प्रदर्शन। –

उत्तर

25

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. गिना जा रहा है हैश कोड, और रैखिक प्रदर्शन की जांच कर जब हैश कोड टकराने: इसका कारण यह है कार्यान्वयन विवरण का मतलब है कि इस जोड़ी को इटरेटर बिना शब्दकोश पुनरावृति करने में सक्षम है है।
  • संबंधित मुद्दे