2012-05-14 8 views
6

है, मैं डेटा रखने के लिए Dictionary<int, KeyValuePair<bool, int>> का उपयोग कर रहा हूं।
समय-समय पर मुझे KeyValuePair में "int" बढ़ाने की आवश्यकता है, लेकिन यह मुझे नहीं जाने देगा, क्योंकि इसमें कोई सेटटर नहीं है।
क्या इसे बढ़ाने का कोई तरीका है?संपत्ति KeyValuePair <TKey, Tvalue>। वैल्यू में कोई सेटटर

कोड नमूना:

Dictionary<int, KeyValuePair<bool, int>> mDictionary = 
    new Dictionary<int, KeyValuePair<bool, int>>(); 
विधि में

:

mDictionary[trapType].Value++; 
//Error: The property KeyValuePair<TKey, Tvalue>>.Value has no setter 

उत्तर

21

इसमें बढ़ाने के लिए कोई तरीका है?

सं KeyValuePair अपरिवर्तनीय है - यह भी एक मान प्रकार है, तो एक प्रति बनाने वैसे भी मदद नहीं होता के बाद Value संपत्ति का मूल्य बदलते। आप वास्तव में मूल्य की क्या ज़रूरत है एक KeyValuePair होने के लिए -

var existingValue = mDictionary[trapType]; 
var newValue = new KeyValuePair<bool, int>(existingValue.Key, 
              existingValue.Value + 1); 
mDictionary[trapType] = newValue; 

यह बहुत बदसूरत हालांकि:

आप कुछ इस तरह लिखने के लिए होगा?

+3

मैं 'टुपल 'का सुझाव दूंगा। एक बनाने का सबसे छोटा तरीका 'टुपल' होगा (मौजूदा वैल्यू.के, मौजूदा वैल्यू। वैल्यू + 1) '। यद्यपि एक वर्ग बनाना, यदि तार्किक है, तो अनावश्यक 'नया()' 'से बचने के लिए बेहतर होगा। – SimpleVar

+0

@YoryeNathan: हाँ, यह संभवतः उचित होगा - या संपत्ति नामों के साथ एक अलग प्रकार जो 'बूल' और 'int' के वास्तविक अर्थ को दर्शाता है। (मुझे लगता है कि आपने इसके लिए भी अपनी टिप्पणी संपादित की है :) –

+0

हां, हालांकि मैं उन मामलों की कल्पना कर सकता हूं जहां इसका उपयोग कुछ क्विर्की एल्गोरिदम के लिए एक छोटे से दायरे में किया जाएगा, इस मामले में मैं व्यक्तिगत रूप से एक अनाम प्रकार पसंद करूंगा। – SimpleVar

0
mDictionary[trapType] = new KeyValuePair<bool, int>(mDictionary[trapType].Key, mDictionary[trapType].Value+1) 
0

KeyValuePair केवल शब्दकोशों के लिए एक इटरेटर मूल्य के रूप में उपयोग किया जाता है। यदि आप इसे उत्परिवर्तनीय बनाना चाहते हैं तो आप अपने स्वयं के प्रकार को परिभाषित करने से बेहतर हैं।

0

आप एक नया कुंजी मान युग्म के निर्माण के लिए

mDictionary[trapType] = new KeyValuePair<bool,int>(mDictionary[trapType].Key,mDictionary[trapType].Value +1); 

लेकिन यदि आप नेट 4. पर हैं मैं तुम्हें कुंजी मान युग्म के बजाय ट्रिपल का उपयोग करने का सुझाव चाहते हैं, तो क्या आप की कोशिश कर रहे बस है नया एक वस्तु है जिसमें दो अन्य मूल्य हैं। अगर दोनों के बीच कोई महत्वपूर्ण मूल्य संबंध नहीं है। फिर कोड तो होगा:

mDictionary[trapType] = Tuple.Create(mDictionary[trapType].Item1,mDictionary[trapType].Item2 +1); 
0

एक और समाधान यह करने के लिए एक नया शब्दकोश बनाने के लिए और नए मूल्यों और चाबी पारित है:

foreach (var d in existingDic) 
        newDic.Add(d.Key, d.Value + 1); 
0

वैचारिक रूप से, KeyValuePair<TKey,TValue> चर का सिर्फ एक जोड़ी है, Key और Value। अगर माइक्रोसॉफ्ट ने इसे सार्वजनिक क्षेत्रों के Key और Value के साथ कार्यान्वित किया था, तो इसका अर्थशास्त्र सही होगा; जब ForEach नियंत्रण चर के रूप में उपयोग किया जाता है तो यह अपरिवर्तनीय होता, लेकिन कोई अन्य को अद्यतन किए बिना सामान्य चर या सरणी तत्व की कुंजी या मान फ़ील्ड को अपडेट कर सकता था।

दुर्भाग्य से, माइक्रोसॉफ्ट के लिए तैयार नहीं किया गया है ढांचे प्रकार भी सार्वजनिक क्षेत्रों को दर्शाना, यहां तक ​​कि KeyValuePair<TKey,TValue> या Drawing.Rectangle जिसका अर्थ विज्ञान हुक्म है कि (1) प्रकार एक struct होना चाहिए, जैसे प्रकार के लिए लगता है, (2) इसकी पूरी स्थिति गुणों के एक निश्चित सेट में दिखाई दे रही है (उन वस्तुओं के अलावा अन्य गणना गुण हो सकते हैं जो किसी ऑब्जेक्ट की स्थिति को परिभाषित करते हैं), और (3) उन गुणों को उनके प्रकार के लिए उपयुक्त मानों का कोई संयोजन सौंपा जा सकता है। नतीजतन, माइक्रोसॉफ्ट ने केवल 'राज्य को पढ़ने-योग्य गुणों के रूप में, या रीड-राइट गुणों के रूप में सदस्यों को उजागर करने की संभावनाओं पर विचार किया।पढ़ने-लिखने की संपत्तियों का उपयोग करना मतलब यह होगा कि कोड की तरह:

for each (var item in myDictionary) 
    item.Value += 1; 

या

...assuming MyList is a List<Drawing.Rectangle> 
MyList[3].Width += 9; 

या तो

for each (var item in myDictionary) 
{ var temp = item; temp .Value += 1; } 

या

...assuming MyList is a List<Drawing.Rectangle> 
{ temp = MyList[3]; temp.Width += 9; } 
के रूप में मौजूदा सी # संकलक द्वारा व्याख्या की जाएगी

दोनों उपज भयानक बीहा vior जो लगभग निश्चित रूप से प्रोग्रामर इरादा नहीं है। .NET के कार्यान्वयनकर्ताओं ने निर्णय लिया कि KeyValuePair<TKey,TValue> के सदस्यों को व्यक्तिगत रूप से उत्परिवर्तनीय होने का मूल्य पूर्व द्वारा उत्पन्न खतरे को न्यायसंगत नहीं ठहराया गया है, लेकिन Rectangle के व्यक्तिगत सदस्यों को संशोधित करने की उपयोगिता दूसरे द्वारा उत्पन्न खतरे को न्यायसंगत साबित करने के लिए पर्याप्त थी। ध्यान दें कि किसी भी उदाहरण को किसी भी खतरे को उत्पन्न करने के लिए गुणों के बजाय उजागर क्षेत्रों का उपयोग नहीं किया जाना चाहिए था, क्योंकि अस्थायी संरचना के क्षेत्र में लिखने की अनुमति कभी भी स्वीकार्य नहीं थी, यहां तक ​​कि संपत्ति सेटर्स को कॉल करते समय भी।

0

जैसा कि पहले उल्लेख किया गया था, KeyValuePair अपरिवर्तनीय है। मैंने सोचा कि यह एक परिवर्तनीय कार्यान्वयन जोड़ने के लायक था:

public class MutableKeyValuePair<KeyType, ValueType> 
    { 
     public KeyType Key { get; set; } 
     public ValueType Value { get; set; } 

     public MutableKeyValuePair() { } 

     public MutableKeyValuePair(KeyType key, ValueType val) 
     { 
      Key = key; 
      Value = val; 
     } 
    } 
संबंधित मुद्दे