शब्दकोश में C # में संग्रहीत मान को कैसे अपडेट करें?


455

एक शब्दकोश में एक विशिष्ट कुंजी के लिए मूल्य कैसे अपडेट करें Dictionary<string, int>?


मेरे पास एक जटिल प्रकार है जो शब्दकोश में मूल्य के रूप में संग्रहीत है। जब मैं एक संग्रहीत मूल्य की संपत्ति बदलना चाहता हूं, तो मुझे CS1612 मिलता है। इसलिए मुझे एक रास्ता निकालना चाहिए: var v = dict [c]; v.dprop = c.sprop; तानाशाही [सं-पु।] वि;
15

जवाबों:


762

केवल दिए गए कुंजी पर शब्दकोश को इंगित करें और एक नया मान निर्दिष्ट करें:

myDictionary[myKey] = myNewValue;

तो यह सरल विधि भी अच्छी तरह से ज्ञात ".Add" और ".TryGetValue" विधि के लिए एक बेहतर विकल्प है जो मूल्य को बदलने की आवश्यकता के बिना है। (?) कम से कम, अगर यह कुंजी को अधिलेखित करने के लिए कोई फर्क नहीं पड़ता है, उदाहरण के लिए ऐसी स्थिति में जहां इसे बाहर नहीं रखा गया है कि चाबियाँ एक से अधिक बार लूप में लिखी जाती हैं। या किसी को कोई कमी दिखाई देती है? विशेष रूप से क्योंकि .dd में शुरुआती के लिए ptifall है कि अगर if-आवरण या TryGetValue को भुला दिया जाता है, तो यह परीक्षणों में और अन्य परीक्षण डेटा के साथ ठीक काम कर सकता है जहाँ .Add को एक ही कुंजी के लिए दो बार बुलाया जाता है, यह एक अपवाद फेंक देगा।
फिलम

1
इस ऑपरेशन का दिलचस्प बिंदु यह है कि, यह UPSERT (कुंजी, मूल्य) शब्दकोश में है। प्रतिभाशाली!
सोरेन

1
जैसा कि पीनी ने कहा, यह सवाल का जवाब होना चाहिए। सही बात और इसे बदलने के कारण।
गुरूवार को लियो गुरदियन

190

यह सूचकांक के रूप में कुंजी को एक्सेस करके संभव है

उदाहरण के लिए:

Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary["test"] = 1;
dictionary["test"] += 1;
Console.WriteLine (dictionary["test"]); // will print 2

11
यदि सूची में कोई आइटम "परीक्षण" नहीं है, तो सूची ["परीक्षण"] = सूची ["परीक्षण"] + 1; KeyNotFoundException बढ़ाएगा! एक गैर-मौजूदा इंडेक्सर का शुद्ध असाइनमेंट काम करेगा। सूची ["परीक्षण"] = 1;
स्टीवन स्पायरका

क्या आप सूची ["परीक्षण"] ++ का उपयोग कर सकते हैं ?;
18

17
डिक्शनरी लिस्ट न बुलाएं, इसे कुत्ते या बिल्ली कहें या
तानाशाह

1
@aufty आप लिख सकते हैं ++dictionary["test"];या dictionary["test"]++;केवल तभी यदि कुंजी मान "परीक्षण" के साथ शब्दकोश में कोई प्रविष्टि है - उदाहरण: if(dictionary.ContainsKey("test")) ++dictionary["test"]; else dictionary["test"] = 1; // create entry with key "test"
gerryLowry

46

आप इस दृष्टिकोण का अनुसरण कर सकते हैं:

void addOrUpdate(Dictionary<int, int> dic, int key, int newValue)
{
    int val;
    if (dic.TryGetValue(key, out val))
    {
        // yay, value exists!
        dic[key] = val + newValue;
    }
    else
    {
        // darn, lets add the value
        dic.Add(key, newValue);
    }
}

यहां आपको जो बढ़त मिलती है वह यह है कि आप चेक करते हैं और शब्दकोश में केवल 1 एक्सेस के लिए संबंधित कुंजी का मूल्य प्राप्त करते हैं। यदि आप ContainsKeyअस्तित्व की जांच करने के लिए उपयोग करते हैं और मूल्य का उपयोग करके अद्यतन करते हैं dic[key] = val + newValue;तो आप शब्दकोश को दो बार एक्सेस कर रहे हैं।


4
dic.Add(key, newValue);आप के बजाय उपयोग कर सकते हैं dic[key] = newvalue;
मैके

यदि आप "dic [key] = value" करते हैं और "key" मौजूद नहीं है तो क्या होगा?
सुपरपुकियो

1
@superpuccio आपको एक KeyNotFoundException मिलती है
ntroncos

8
@ntroncos सत्य नहीं है, यह उस कुंजी को शब्दकोष में उपलब्ध कराएगा। + = हालांकि एक गैर-मौजूदा कुंजी पर काम नहीं करेगा, क्योंकि यह केवल dic [key] = value + dic [key] के लिए सिंटैक्टिक चीनी है।
लास्ट

2
यह सवाल का जवाब होना चाहिए क्योंकि यह शब्दकोश को अपडेट करने के संबंध में है, न कि केवल इसे जोड़ने के लिए।
लोनली कोडर

15

LINQ का उपयोग करें: कुंजी के लिए शब्दकोश में प्रवेश करें और मूल्य बदलें

Dictionary<string, int> dict = new Dictionary<string, int>();
dict = dict.ToDictionary(kvp => kvp.Key, kvp => kvp.Value + 1);

मुझे यह भी समझ नहीं आ रहा है कि यह कैसे काम करता है लेकिन यह आश्चर्यजनक है
हेक्सागोनिस्ट

1
एक और शब्दकोष बनाना मेरे लिए इतनी सरल बात नहीं है। Ccalboni के उत्तर की जाँच करें।
रोलरकोस्टा

1
मुझे लगता है कि यह एक अच्छा जवाब है। यह आपको प्रत्येक कुंजी स्ट्रिंग जानने की आवश्यकता नहीं है
जोसेफ वू

9

यहाँ एक इंडेक्स द्वारा अपडेट करने का एक तरीका है जैसे foo[x] = 9कि xएक कुंजी कहाँ है और 9 मान है

var views = new Dictionary<string, bool>();

foreach (var g in grantMasks)
{
    string m = g.ToString();
    for (int i = 0; i <= m.Length; i++)
    {
        views[views.ElementAt(i).Key] = m[i].Equals('1') ? true : false;
    }
}

13
मी [i]। इक्वल्स ('1') पहले से ही एक बूल का मूल्यांकन करता है, इसलिए जोड़ रहा है? सच: असत्य आवश्यक नहीं है
वेसल वैन डेर लिंडेन

मुझे नहीं पता कि यह तर्क कितना कुशल है, लेकिन मुझे फॉर लूप विचार पसंद है। :)
खुली और मुफ्त

2
  1. अद्यतन - केवल अस्तित्व को संशोधित करें। अनुक्रमणिका उपयोग के दुष्प्रभाव से बचने के लिए:

    int val;
    if (dic.TryGetValue(key, out val))
    {
        // key exist
        dic[key] = val;
    }
  2. अद्यतन या ( यदि मूल्य में मौजूद नहीं है तो नया जोड़ें )

    dic[key] = val;

    उदाहरण के लिए:

    d["Two"] = 2; // adds to dictionary because "two" not already present
    d["Two"] = 22; // updates dictionary because "two" is now present

1

यह आपके लिए काम कर सकता है:

परिदृश्य 1: आदिम प्रकार

string keyToMatchInDict = "x";
int newValToAdd = 1;
Dictionary<string,int> dictToUpdate = new Dictionary<string,int>{"x",1};

if(!dictToUpdate.ContainsKey(keyToMatchInDict))
   dictToUpdate.Add(keyToMatchInDict ,newValToAdd );
else
   dictToUpdate[keyToMatchInDict] = newValToAdd; //or you can do operations such as ...dictToUpdate[keyToMatchInDict] += newValToAdd;

परिदृश्य 2: जिस दृष्टिकोण का मैंने मूल्य के रूप में एक सूची के लिए उपयोग किया है

int keyToMatch = 1;
AnyObject objInValueListToAdd = new AnyObject("something for the Ctor")
Dictionary<int,List<AnyObject> dictToUpdate = new Dictionary<int,List<AnyObject>(); //imagine this dict got initialized before with valid Keys and Values...

if(!dictToUpdate.ContainsKey(keyToMatch))
   dictToUpdate.Add(keyToMatch,new List<AnyObject>{objInValueListToAdd});
else
   dictToUpdate[keyToMatch] = objInValueListToAdd;

आशा है कि यह मदद की जरूरत में किसी के लिए उपयोगी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.