2012-07-20 32 views
15

आप जटिल डेटा प्रकारों जैसे शब्दकोश के लिए गेटर और सेटर को कैसे परिभाषित करते हैं?एक शब्दकोश के लिए गेटर और सेटटर कैसे लिखें?

public Dictionary<string, string> Users 
{ 
    get 
    { 
     return m_Users; 
    } 

    set 
    { 
     m_Users = value; 
    } 
} 

यह संपूर्ण शब्दकोश देता है? क्या आप सेटर को देखने और देखने के लिए लिख सकते हैं कि कोई विशिष्ट कुंजी-मूल्य जोड़ी मौजूद है या नहीं, और यदि यह नहीं है, तो इसे जोड़ें। अन्यथा वर्तमान कुंजी मूल्य जोड़ी अद्यतन करें? प्राप्त करने के लिए, क्या आप पूरे शब्दकोश के बजाय एक विशिष्ट कुंजी-मूल्य जोड़ी वापस कर सकते हैं?

+2

एक इंडेक्सर संपत्ति का उपयोग करें:

public class YourClass { private readonly IDictionary<string, string> _yourDictionary = new Dictionary<string, string>(); public string this[string key] { // returns value if exists get { return _yourDictionary[key]; } // updates if exists, adds if doesn't exist set { _yourDictionary[key] = value; } } } 

तब की तरह इस्तेमाल करते हैं। Http://msdn.microsoft.com/en-us/library/aa288464(VS.71).aspx –

+0

उत्तरों के लिए धन्यवाद देखें। अब मुझे पता है कि मेरे पास विकल्प हैं। मैं एक सूचकांक का उपयोग करने के बजाय, प्राप्त करने और सेट विधियों को बनाना पसंद करते हैं। – Mausimo

उत्तर

16

ऐसा करना संभव नहीं है जिसमें केवल गुण शामिल हों। आप सैद्धांतिक रूप से एक सेटर लिख सकते हैं, लेकिन गेटर के लिए, आपको एक कुंजी निर्दिष्ट करने की आवश्यकता होगी जिसे आप पुनर्प्राप्त करना चाहते हैं। यह असंभव है क्योंकि गुण पैरामीटर स्वीकार नहीं करते हैं। प्राकृतिक तरीके से पूरा करने के लिए क्या आप चाहते हैं तरीकों का उपयोग करने के लिए होगा:

private Dictionary<string, string> users = new Dictionary<string, string>(); 

public void Set(string key, string value) 
{ 
    if (users.ContainsKey(key)) 
    { 
     users[key] = value; 
    } 
    else 
    { 
     users.Add(key, value); 
    } 
} 

public string Get(string key) 
{ 
    string result = null; 

    if (users.ContainsKey(key)) 
    { 
     result = users[key]; 
    } 

    return result; 
} 

वैकल्पिक रूप से, के रूप में दूसरों को पहले से ही कहा है, आप indexers इस्तेमाल कर सकते हैं, लेकिन मैं हमेशा उन्हें एक छोटे से बोझिल पाया है। लेकिन मुझे लगता है कि यह सिर्फ व्यक्तिगत वरीयता का मामला है।

और बस पूर्णता के लिए के लिए, यह एक सेटर, की तरह लग सकता है, हालांकि यह कैसे इस तरह के एक संपत्ति के लिए बेहद असामान्य और जवाबी सहज है है:

public KeyValuePair<string, string> Users 
{ 
    set 
    { 
     Set(value.Key, value.Value); 
    } 
} 

आंतरिक रूप से, यह से Set विधि का उपयोग करता मेरा पिछला स्निपेट

+2

यह ध्यान देने योग्य है कि आप मूल्य निर्धारित करने के लिए तकनीकी रूप से किसी संपत्ति का उपयोग कर सकते हैं (केवल प्रकार की संपत्ति है 'keyvaluepair')। आप कुंजी के लिए मान (या जोड़ी) प्राप्त करने के लिए 'get'ter' का उपयोग नहीं कर सकते क्योंकि आप एक कुंजी निर्दिष्ट नहीं कर सकते हैं। – Servy

+0

एक सूचकांक संपत्ति का उपयोग कर सकता है, एक विधि की आवश्यकता नहीं है, प्रति से .... –

+0

@ सर्वी बेशक, * तकनीकी रूप से *, आप कर सकते हैं, लेकिन यह काफी अप्राकृतिक होगा। –

1

आप एक संपत्ति के साथ ऐसा करने में सक्षम नहीं होंगे। आपको इसके लिए विधियों का उपयोग करने की आवश्यकता होगी, या अपनी कक्षा में एक इंडेक्सर जोड़ना होगा। get विधि पैरामीटर (कुंजी) स्वीकार नहीं कर सकता है।

एक और विकल्प, यदि आप चाहते हैं कि कोई भी शब्दकोश को आसानी से जोड़ने/निकालने में सक्षम हो, लेकिन उन्हें पूरी तरह से नया सेट करने से रोकें, तो संपत्ति को केवल पढ़ने-योग्य संपत्ति बनाना होगा जो एक शब्दकोश में निर्मित शब्दकोश देता है निर्माता। प्राप्त करने/सेट विधियों को जोड़ने के बाद यह कम लचीला होगा, लेकिन आम तौर पर, साधारण मामलों में यह ठीक हो सकता है।

+1

+1 इंडेक्सर शायद वह –

+0

चाहता है जो वह चाहता है उसे करने के तरीके हैं। बस सीधे नहीं। – Ani

0

ऐसा लगता है कि आप "नामित इंडेक्सर" चाहते हैं। सी # का उपयोग करके इसे पूरा करने के लिए यहां (मेरा) one तरीका है।

मेरा दृष्टिकोण ऐसी संपत्ति का खुलासा करता है जो एक ऑब्जेक्ट (एक डिफ़ॉल्ट इंडेक्सर के साथ) देता है जो लम्बास को उचित क्षेत्र में अनुक्रमणित करता है।

ऐसे कारण हैं जिनका आप इस विधि का उपयोग करना चाहते हैं या नहीं, लेकिन मैं इसे आपके पास छोड़ दूंगा। :)

+2

क्यों न केवल एक सूचकांक का उपयोग करें? –

+0

क्योंकि मेरे पास एक वर्ग पर एकाधिक इंडेक्सर्स हो सकते हैं जो समान पैरामीटर प्रकार लेते हैं। बच्चे [int सूचकांक] और ग्राहक [int सूचकांक]। इसके अलावा, ओपी का उपयोग केस obj.Foo [...], obj नहीं है [...] – Ani

0

यह सेटटर के साथ ऐसा करने के लिए संभव है लेकिन अत्यधिक अनुशंसित है, और गेटटर के साथ पूरी तरह असंभव है क्योंकि यह निर्धारित करने के लिए कोई पैरामीटर नहीं लेता है।

सेटर के लिए आपको एक ही जोड़ी के साथ Dictionary<string, string> पास करना होगा, लेकिन यह आमतौर पर गेटटर/सेटर की अपेक्षा करने के लिए आपको क्या होगा और पूरी तरह से आपको संपूर्ण शब्दकोश सेट करने से रोक देगा।

यदि आप चाहें तो प्राप्त करने और सेट करने के तरीकों की एक जोड़ी का उपयोग करने का एक बेहतर तरीका है।

22

एक इंडेक्सर संपत्ति (MSDN) का उपयोग करें:

var test = new YourClass(); 
test["Item1"] = "Value1"; 
+0

अच्छा है! लेकिन जैसा कि निकोला अनुसेव ने कहा, संपत्ति की स्थापना करते समय, आपको यह जांचना चाहिए कि यह '_yourDictionary.ContaineKey (कुंजी) 'के साथ पहले से मौजूद है या नहीं। और यदि ओटी मौजूद नहीं है, तो आपको इसे 'yourDictionary' के साथ सेट करना चाहिए। जोड़ें (कुंजी, मान) ' – Yoone

+1

यह केवल तभी काम करेगा जब कक्षा स्थिर नहीं है, शायद एक स्थिर वर्ग के विकल्प के बारे में सोचना चाहें ... – TGarrett

0
Dictionary<string, string> param = new Dictionary<string, string>(); 

public void SetYourParameter(string parametrName, string paramValue) 
{ 
    param[parametrName] = paramValue;    
} 

public string GetYourParameter(string parametrName) 
{ 
    // ContainKey ---> It returns value if the key was found 
    if(param.ContainsKey(parametrName)) 
     return param[parametrName]; 
    else 
     return null; 
}