কোনও অভিধান <>>> এ নিরাপদে নিরাপদে কোনও আইটেম যুক্ত করার কি আরও দুর্দান্ত উপায় আছে?


141

আমাকে অভিধানে কী / অবজেক্টের জোড় যুক্ত করতে হবে, তবে অবশ্যই অবশ্যই প্রথমে চেক করা দরকার কীটি ইতিমধ্যে উপস্থিত আছে কিনা তা না হলে আমি একটি " অভিধানে ইতিমধ্যে উপস্থিত কী " ত্রুটি পেয়েছি । নীচের কোডটি এটিকে সমাধান করে তবে আটকানো।

এর মতো স্ট্রিং সহায়ক পদ্ধতি তৈরি না করে এটি করার আরও দুর্দান্ত উপায় কী?

using System;
using System.Collections.Generic;

namespace TestDictStringObject
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, object> currentViews = new Dictionary<string, object>();

            StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view1");
            StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view2");
            StringHelpers.SafeDictionaryAdd(currentViews, "Employees", "view1");
            StringHelpers.SafeDictionaryAdd(currentViews, "Reports", "view1");

            foreach (KeyValuePair<string, object> pair in currentViews)
            {
                Console.WriteLine("{0} {1}", pair.Key, pair.Value);
            }
            Console.ReadLine();
        }
    }

    public static class StringHelpers
    {
        public static void SafeDictionaryAdd(Dictionary<string, object> dict, string key, object view)
        {
            if (!dict.ContainsKey(key))
            {
                dict.Add(key, view);
            }
            else
            {
                dict[key] = view;
            }
        }
    }
}

উত্তর:


246

শুধু indexer ব্যবহার করেন - যদি এটি ইতিমধ্যেই আছে সেটি মুছে হবে, কিন্তু এটি না আছে সেখানে প্রথম হতে:

Dictionary<string, object> currentViews = new Dictionary<string, object>();
currentViews["Customers"] = "view1";
currentViews["Customers"] = "view2";
currentViews["Employees"] = "view1";
currentViews["Reports"] = "view1";

মূলত ব্যবহার করুন Addযদি কীটির অস্তিত্ব কোনও বাগ নির্দেশ করে (তাই আপনি এটি নিক্ষেপ করতে চান) এবং অন্যথায় সূচক। (এটি কাস্টিং এবং asরেফারেন্স রূপান্তরগুলির জন্য ব্যবহারের মধ্যে পার্থক্যের মতো কিছুটা ))

আপনি যদি সি # 3 ব্যবহার করছেন এবং আপনার কীগুলির একটি পৃথক সেট রয়েছে , আপনি এটি আরও সুন্দর করতে পারেন:

var currentViews = new Dictionary<string, object>()
{
    { "Customers", "view2" },
    { "Employees", "view1" },
    { "Reports", "view1" },
};

যদিও এটি আপনার ক্ষেত্রে কাজ করবে না, কারণ সংগ্রহের সূচনাকারীরা সর্বদা ব্যবহার করে Addযা দ্বিতীয় Customersপ্রবেশের সময়টি ফেলে দেয় ।


6
দুর্দান্ত, উপলব্ধি করতে পারেনি সহজ অ্যাসাইনমেন্টটি অ্যাড / ওভাররাইট ইস্যুর যত্ন নিয়েছে, দুর্দান্ত।
এডওয়ার্ড টাঙ্গুয়ে

49

কি সমস্যা...

dict[key] = view;

অস্তিত্ব না থাকলে এটি স্বয়ংক্রিয়ভাবে কী যুক্ত করবে।


3
আমার মনে করার মতো একটি জিনিস যে আপনি যদি কোনও int সংরক্ষণ করে dict[key] += amountথাকেন তবে কীটি উপস্থিত না থাকলে কাজ করবে না
ক্রিস এস

22

কেবল

dict[key] = view;

অভিধানের আইএসডিএন ডকুমেন্টেশন থেকে

নির্দিষ্ট কীটির সাথে সম্পর্কিত মান। যদি নির্দিষ্ট কীটি পাওয়া যায় না, তবে একটি গেট অপারেশন একটি কীনটফাউন্ডএক্সসেপশন ছুড়ে দেয় এবং একটি সেট অপারেশন নির্দিষ্ট কী সহ একটি নতুন উপাদান তৈরি করে

আমার জোর


10

যথারীতি জন স্কিটি সঠিক উত্তরের সাথে আলোর গতির সাথে সেখানে প্রবেশ করে, তবে মজার বিষয় হল আপনি আইডিয়োরিয়ায় একটি এক্সটেনশন পদ্ধতি হিসাবে নিজের সেফএডও লিখতে পারতেন।

public static void SafeAdd(this IDictionary<K, T>. dict, K key, T value)...

9

যদিও সূচক ব্যবহার করা আপনার নির্দিষ্ট সমস্যার জন্য পরিষ্কারভাবে সঠিক উত্তর, একটি বিদ্যমান ধরণের অতিরিক্ত কার্যকারিতা যুক্ত করার সমস্যার আরেকটি সাধারণ উত্তর হ'ল একটি এক্সটেনশন পদ্ধতির সংজ্ঞা দেওয়া।

স্পষ্টতই এটি কোনও কার্যকর উদাহরণ নয়, তবে পরবর্তী সময় আপনি যখন সত্যিকারের প্রয়োজন খুঁজে পান তখন মনে রাখার মতো কিছু:

public static class DictionaryExtensions
{
    public static void SafeAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict, 
                                             TKey key, TValue value)
    {
        dict[key] = value;
    }
}

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