অভিধানে যুক্ত করার বিভিন্ন উপায়


107

Dictionary.add(key, value)এবং এর মধ্যে পার্থক্য কী Dictionary[key] = value?

আমি লক্ষ করেছি যে ArgumentExceptionসদৃশ কীটি সন্নিবেশ করানোর সময় শেষ সংস্করণটি নিক্ষেপ করে না , তবে প্রথম সংস্করণটি পছন্দ করার কোনও কারণ আছে কি?

সম্পাদনা : কারও কাছে এ সম্পর্কে তথ্যের কোনও অনুমোদনযোগ্য উত্স আছে? আমি এমএসডিএন চেষ্টা করেছি, তবে এটি বরাবরই বন্য হংসের তাড়া :(

উত্তর:


109

পারফরম্যান্স প্রায় 100% অভিন্ন। আপনি রেফ্লেক্টর.নেটে ক্লাস খুলে এটি পরীক্ষা করে দেখতে পারেন

এই সূচক:

public TValue this[TKey key]
{
    get
    {
        int index = this.FindEntry(key);
        if (index >= 0)
        {
            return this.entries[index].value;
        }
        ThrowHelper.ThrowKeyNotFoundException();
        return default(TValue);
    }
    set
    {
        this.Insert(key, value, false);
    }
}

এবং এটি অ্যাড পদ্ধতি:

public void Add(TKey key, TValue value)
{
    this.Insert(key, value, true);
}

আমি পুরো সন্নিবেশ পদ্ধতিটি এটি দীর্ঘ হিসাবে পোস্ট করব না, তবে পদ্ধতি ঘোষণাটি হ'ল:

private void Insert(TKey key, TValue value, bool add)

এবং আরও নিচে ফাংশন, এই ঘটে:

if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
    if (add)
    {
        ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
    }

কীটি ইতিমধ্যে উপস্থিত রয়েছে কিনা তা যাচাই করে এবং যদি এটি হয় এবং পরামিতি যুক্ত হয় তবে এটি ব্যতিক্রম ছুঁড়ে দেয়।

সুতরাং সমস্ত উদ্দেশ্য এবং উদ্দেশ্যগুলির জন্য পারফরম্যান্স একই।

কয়েকটি অন্যান্য উল্লেখের মতো, একই কী দু'বার যুক্ত করার চেষ্টা করার জন্য আপনার চেক দরকার কিনা সে সম্পর্কে এটি সবই।

দীর্ঘ পোস্টের জন্য দুঃখিত, আমি আশা করি এটি ঠিক আছে।


+1 খুব আকর্ষণীয়, আপনার পোস্টের জন্য ধন্যবাদ! দেখে মনে হবে যে পারফরম্যান্স এখানে প্রায় অভিন্ন, অন্য পোস্টাররা যেমন ইঙ্গিত করেছে, যাইহোক দুর্দান্ত খুঁজে পাওয়া যায় :)
সুন রিভার্স

70

প্রথম সংস্করণ অভিধানে একটি নতুন কীভ্যালু পেয়ার যুক্ত করবে, অভিধানটি কী ইতিমধ্যে রয়েছে কিনা তা ছোঁড়াচ্ছে। দ্বিতীয়টি, সূচক ব্যবহার করে, কীটি উপস্থিত না থাকলে একটি নতুন জুড়বে, তবে অভিধানে ইতিমধ্যে উপস্থিত থাকলে কীটির মানটি ওভাররাইট করে।

IDictionary<string, string> strings = new Dictionary<string, string>();

strings["foo"] = "bar";          //strings["foo"] == "bar"
strings["foo"] = string.Empty;   //strings["foo"] == string.empty
strings.Add("foo", "bar");       //throws     

+1 উপরের তথ্যের জন্য আপনার কাছে কোনও উত্স আছে? আমি প্রথম বা পরবর্তী ফর্মটি ব্যবহার করার ক্ষেত্রে কোনও পার্শ্ব প্রতিক্রিয়া বা সতর্কতা রয়েছে কিনা তা শিখতে আগ্রহী।
সুন রিভার্স

3
সত্যিই আমার মাথার উপরের অংশের মতো কোনও উত্স নেই, তবে অন্যান্য মন্তব্যে উল্লিখিত চেয়ে আমি এর থেকে বেশি কিছু মনে করি না। আমি যদি সঠিকভাবে মনে রাখি তবে অ্যাডটি কেবল সূচক ব্যবহার করে তবে কীটি ইতিমধ্যে ব্যবহৃত হচ্ছে কিনা তা আগে পরীক্ষা করে দেখুন।
hrvn

1
স্টিফেনের গ্রহণযোগ্য উত্তর পরিবর্তিত হয়েছে, কারণ তার ডকুমেন্টেশন শীর্ষ খাঁজযুক্ত। যদিও এটি এখনও দুর্দান্ত উত্তর।
সুন রিভার্স

@ সুর: খারাপ পদক্ষেপ ... ব্যক্তিগতভাবে আমি মনে করি এই উত্তরটি স্টেফেনের সামনে রাস্তা ... সোজা কথা এবং একটি সুন্দর উদাহরণ হিসাবে।
demcodemonkey

1
@ সুনিরিভার্স আমি মনে করি, বর্তমান গৃহীত উত্তরের পরিবর্তে এটির পক্ষে উত্তর গৃহীত হলে এটি মানুষের পক্ষে আরও সহায়ক হবে। কারণ এটি গ্রহণযোগ্য প্রশ্নের পরিবর্তে ("পার্থক্য কী") প্রশ্নের সঠিক উত্তর দেয় (এটি পারফরম্যান্সের বিষয়ে কথা বলে এবং প্রায় 99% ব্যবহারকারী এই বিষয় অনুসন্ধান করে (আমার মতো), "পার্থক্য" প্রয়োজন (কেন আমি এটি পূরণ করেছি কেন) বিষয়), এবং গৃহীত উত্তর আমার ও আমাদের দ্বিতীয় বর্জ্য জন্য বেহুদা ছিল পরিবর্তে, এই উত্তর সঠিক হতে
T.Todua

30

Dictionary.Add(key, value)এবং Dictionary[key] = valueবিভিন্ন উদ্দেশ্য আছে:

  • Addপদ্ধতিটি ব্যবহার করুননতুন কী / মান জুড়তে , বিদ্যমান কীগুলি প্রতিস্থাপন করা হবে না (একটি ArgumentExceptionনিক্ষিপ্ত হয়)।
  • অভিধানে কীটি ইতিমধ্যে উপস্থিত রয়েছে কিনা সে বিষয়ে আপনি যদি চিন্তা না করেন তবে সূচকটি ব্যবহার করুন: কীটি অভিধানে না থাকলে কী / মান জোড়া যুক্ত করুন বা যদি কীটি ইতিমধ্যে থাকে তবে নির্দিষ্ট কীটির জন্য মানটি প্রতিস্থাপন করুন অভিধানে

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

28

প্রশ্নের উত্তর দেওয়ার জন্য প্রথমে আমাদের অভিধানের মূল উদ্দেশ্য এবং অন্তর্নিহিত প্রযুক্তির দিকে নজর দেওয়া দরকার।

DictionaryKeyValuePair<Tkey, Tvalue>প্রতিটি মানটিকে তার অনন্য কী দ্বারা প্রতিনিধিত্ব করা হয় এমন তালিকা । ধরা যাক আমাদের কাছে আপনার পছন্দসই খাবারের একটি তালিকা রয়েছে। প্রতিটি মান (খাবারের নাম) তার অনন্য কী দ্বারা উপস্থাপিত হয় (একটি অবস্থান = আপনি এই খাবারটি কতটা পছন্দ করেন)।

উদাহরণ কোড:

Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
    { 1, "Burger"},
    { 2, "Fries"},
    { 3, "Donuts"}
};

যাক আপনি সুস্থ থাকতে চান, আপনি আপনার মতামত পরিবর্তন করেছেন এবং আপনি আপনার প্রিয় "বার্গার" সালাদ দিয়ে প্রতিস্থাপন করতে চান। আপনার তালিকাটি এখনও আপনার পছন্দের তালিকাগুলি, আপনি তালিকার প্রকৃতি পরিবর্তন করবেন না। আপনার প্রিয় তালিকার এক নম্বর স্থানে থাকবে, কেবলমাত্র এর মান পরিবর্তন হবে। আপনি যখন এই কল করবেন এটি এই:

/*your key stays 1, you only replace the value assigned to this key
  you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";

তবে ভুলে যাবেন না আপনি প্রোগ্রামার, এবং এখন থেকে আপনি আপনার বাক্যগুলি সমাপ্ত করে; আপনি ইমোজিগুলি ব্যবহার করতে অস্বীকার করেছেন কারণ তারা সংকলন ত্রুটি ছুঁড়ে ফেলবে এবং সমস্ত পছন্দের তালিকা 0 সূচক ভিত্তিক।

আপনার ডায়েটও বদলে গেল! সুতরাং আপনি আবার আপনার তালিকা পরিবর্তন করুন:

/*you don't want to replace Salad, you want to add this new fancy 0
  position to your list. It wasn't there before so you can either define it*/
myDietFavorites[0] = "Pizza";

/*or Add it*/
myDietFavorites.Add(0, "Pizza");

সংজ্ঞায়নের দুটি সম্ভাবনা রয়েছে, আপনি হয় অস্তিত্বহীন কোন কিছুর জন্য একটি নতুন সংজ্ঞা দিতে চান বা আপনি ইতিমধ্যে বিদ্যমান সংজ্ঞাটি পরিবর্তন করতে চান।

অ্যাড পদ্ধতি আপনাকে একটি রেকর্ড যুক্ত করতে দেয় তবে কেবলমাত্র একটি শর্তাধীন: এই সংজ্ঞাটির কী আপনার অভিধানে উপস্থিত থাকতে পারে exist

এখন আমরা ফণা অধীন দেখতে যাচ্ছি। আপনি যখন কোনও অভিধান তৈরি করছেন তখন আপনার সংকলক বালতিটির জন্য সংরক্ষণ করুন (আপনার রেকর্ড সংরক্ষণের জন্য মেমরির ফাঁকা জায়গা)। বালতি কীভাবে আপনার সংজ্ঞা দেয় সেভাবে সংরক্ষণ করবেন না। বালিতে যাওয়ার আগে প্রতিটি কী হ্যাশ করা হয় (মাইক্রোসফ্ট দ্বারা সংজ্ঞায়িত), উল্লেখযোগ্য যে মান অংশটি অপরিবর্তিত থাকে।

আমি আমার উদাহরণটি সহজ করার জন্য সিআরসি 32 হ্যাশিং অ্যালগরিদম ব্যবহার করব। আপনি যখন সংজ্ঞা দিচ্ছেন:

myDietFavorites[0] = "Pizza";

বালতিতে যা হচ্ছে তা হ'ল db2dc565 "পিজ্জা" (সরলীকৃত)।

আপনি যখন এর সাথে মানটি পরিবর্তন করেন:

myDietFavorites[0] = "Spaghetti";

আপনি আপনার 0 টি হ্যাশ করেছেন যা আবার db2dc565 তবে আপনি নিজের বালতিতে এই খুঁজে পেয়েছেন কিনা তা খুঁজে বের করতে। যদি এটি সেখানে থাকে তবে আপনি কীটির জন্য নির্ধারিত মানটি পুনরায় লিখুন। যদি এটি না থাকে তবে আপনি নিজের মানটি বালতিতে রাখবেন।

আপনি যখন আপনার অভিধানটিতে যুক্ত ফাংশনটিকে কল করবেন তখন:

myDietFavorite.Add(0, "Chocolate");

বালতিতে থাকা মানগুলির সাথে এর মানটির তুলনা করতে আপনি আপনার 0 টি হ্যাশ করেছেন। এটি বালতিতে না থাকলে কেবল এটি থাকতে পারে

এটি কীভাবে কাজ করে তা বিশেষত যদি আপনি স্ট্রিংয়ের অভিধানগুলি বা চর ধরণের কী ব্যবহার করে থাকেন তা জেনে রাখা গুরুত্বপূর্ণ। এটি হ্যাশিংয়ের কারণে কেস সংবেদনশীল। সুতরাং উদাহরণস্বরূপ "নাম"! = "নাম"। এটি চিত্রিত করতে আমাদের সিআরসি 32 ব্যবহার করুন।

"নাম" এর মান: e04112b1 "নাম" এর মান: 1107fb5b


এই দুটি লাইন বোঝার জন্য যথেষ্ট ....... সংজ্ঞায়নের সাথে দুটি সম্ভাবনা রয়েছে, আপনি হয় আগে অস্তিত্বহীন কোন কিছুর জন্য একটি নতুন সংজ্ঞা দিতে চান বা আপনি ইতিমধ্যে বিদ্যমান সংজ্ঞাটি পরিবর্তন করতে চান। অ্যাড পদ্ধতি আপনাকে একটি রেকর্ড যুক্ত করতে দেয় তবে কেবলমাত্র একটি শর্তাধীন: এই সংজ্ঞাটির কী আপনার অভিধানে উপস্থিত থাকতে পারে exist
নিরাজ ত্রিবেদী

4

হ্যাঁ, এটাই পার্থক্য, কীটি ইতিমধ্যে উপস্থিত থাকলে অ্যাড পদ্ধতিটি একটি ব্যতিক্রম ছুঁড়ে দেয়।

অ্যাড পদ্ধতিটি ব্যবহার করার কারণটি হুবহু এটি। যদি অভিধানটিতে ইতিমধ্যে কীটি ধারণ করার কথা না মনে হয় তবে আপনি সাধারণত ব্যতিক্রম চান যাতে আপনার সমস্যার বিষয়ে সচেতন হয়।


0

পারফরম্যান্সে সম্ভাব্য সাদৃশ্যগুলির চেয়ে বেশিরভাগ ক্ষেত্রে, আপনি যে কোডটি ব্যবহার করছেন সেটিকে আরও সঠিক এবং পাঠযোগ্য মনে হয় তা ব্যবহার করুন।

আমি একটি অপারেশন অনুভব করছি যা সংযোজনকে বর্ণনা করে, কীটির উপস্থিতি ইতিমধ্যে সত্যিই বিরল ব্যতিক্রম অ্যাডের সাথে উপস্থাপিত। শব্দার্থগতভাবে এটি আরও অর্থবোধ করে।

dict[key] = valueভাল একটি প্রতিকল্পন প্রতিনিধিত্ব করে। যদি আমি সেই কোডটি দেখি তবে আমি অর্ধেকটি কীটি ইতিমধ্যে অভিধানে থাকা আশা করি।


আমি ধরে নেব যে কীটি প্রথম আছে কিনা তা যাচাই না করে একটি ছোট পারফরম্যান্স লাভ রয়েছে। dic[key] = valueচাবিটি ইতিমধ্যে উপস্থিত ছিল এমনটি থেকে আমি প্রত্যাশা করব না তবে আমার ধারণা এটি বিতর্কযোগ্য;)
সুন রিভার্স

2
+ আমি মনে করি যে কীটি ইতিমধ্যে উপস্থাপন করা হয়েছে তা নিক্ষেপ করার উপায় হিসাবে কখনও পরীক্ষা করা উচিত নয়। if (! strings.ContainsKey ("foo")) স্ট্রিংস.এড করুন ("foo", "বার");
hravn

0

এর মধ্যে একটি মান নির্ধারণ করছে অন্যটি অভিধানে একটি নতুন কী এবং মান যুক্ত করছে।


0

অভিধানে মান সন্নিবেশ করতে

 Dictionary<string, string> dDS1 = new Dictionary<string, string>();//Declaration
 dDS1.Add("VEqpt", "aaaa");//adding key and value into the dictionary
 string Count = dDS1["VEqpt"];//assigning the value of dictionary key to Count variable
 dDS1["VEqpt"] = Count + "bbbb";//assigning the value to key
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.