সি # তে অভিধানে সঞ্চিত মান কীভাবে আপডেট করবেন?


455

অভিধানে একটি নির্দিষ্ট কীটির মান কীভাবে আপডেট করবেন Dictionary<string, int>?


আমার কাছে অভিধানে মান হিসাবে একটি জটিল প্রকারের সঞ্চয় রয়েছে। আমি যখন সঞ্চিত মানের একটি সম্পত্তি পরিবর্তন করতে চাই তখন আমি CS1612 পাই। অতএব আমি অবশ্যই একটি পথ অবলম্বন করব: var v = ڈک [সি]; v.dprop = c.sprop; ডিক্ট [সি] = ভি;
পিটার 70

উত্তর:


762

কেবলমাত্র প্রদত্ত কীতে অভিধানের দিকে নির্দেশ করুন এবং একটি নতুন মান নির্ধারণ করুন:

myDictionary[myKey] = myNewValue;

সুতরাং এই সহজ পদ্ধতিটিও ".Ad" এবং ".TryGetValue" পদ্ধতির মান পরিবর্তন করার প্রয়োজনীয়তা ছাড়াই সুপরিচিত একটি ভাল বিকল্প বলে মনে হয়। (?) কমপক্ষে, কীগুলি ওভাররাইট করার ক্ষেত্রে যদি তা বিবেচনা না করে, উদাহরণস্বরূপ এমন পরিস্থিতিতে যেখানে কীগুলি লুপে একাধিকবার রচিত হয় তা বাদ যায় না written বা কেউ কি কোনও অসুবিধা দেখতে পাচ্ছেন? বিশেষত কারণ .আড্ডারদের জন্য ক্ষতির কারণ রয়েছে যে যদি যদি-র‌্যাপার বা ট্রাইগেটভ্যালু ভুলে যায় তবে এটি পরীক্ষাগুলিতে এবং অন্যান্য পরীক্ষার ডেটা দিয়ে ভাল কাজ করতে পারে যেখানে একই কীটির জন্য দু'বার ডাকলে এটি ব্যতিক্রম ছুঁড়ে ফেলবে।
ফিল্ম

1
এই অপারেশনের আকর্ষণীয় বিষয়টি হ'ল, এটি অভিধানে ইউপিএসআরটি (কী, মান)। উজ্জ্বল!
সোরেন

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 তালিকা করুন; কীনটফাউন্ডএক্সসেপশন বাড়িয়ে তুলবে! অ-বিদ্যমান সূচকটির খাঁটি অ্যাসাইনমেন্ট কাজ করবে। তালিকা ["পরীক্ষা"] = 1;
স্টিভেন স্পেরকা 26'15

আপনি কি ["পরীক্ষা"] ++; তালিকা ব্যবহার করতে পারেন?
আউফটি

17
কোনও অভিধানের তালিকায় কল করবেন না, এটিকে কুকুর বা বিড়াল বা ডিক বলুন
ব্যবহারকারীর 3800527

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;
মককে

আপনি যদি "ডিক [কী] = মান" এবং "কী" না রাখেন তবে কি হবে?
সুপারপুসিও

1
@ সুপারপুসিও আপনি কী
নটফাউন্ডএক্সেপশন

8
@ এন্ট্রোনকোস সত্য নয়, এটি সেই মানটি প্রদত্ত মানের সাথে অভিধানে যুক্ত করবে। + = যদিও অ-বিদ্যমান কীতে কাজ করবে না, যেহেতু এটি ডিক [কী] = মান + ডিক [কী] এর জন্য কেবল সিনট্যাকটিক চিনি।
শেষ

2
এটি অভিধানটির সাথে যোগ না করে আপডেট করার ক্ষেত্রে এটি প্রশ্নের উত্তর হওয়া উচিত।
নিঃসঙ্গ কোডার

15

লিনকিউ ব্যবহার করুন: কীটির জন্য অভিধানে অ্যাক্সেস করুন এবং মানটি পরিবর্তন করুন

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যেখানে x9 কী রয়েছে

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;

আশা করি এটির সহায়তার জন্য কারও পক্ষে এটি কার্যকর।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.