অভিধানে নতুন যুক্ত করার বা বিদ্যমান আইটেমটি আপডেট করার পদ্ধতি


235

কিছু লিগ্যাসি কোডে আমি একটি নতুন কী-মান আইটেম যুক্ত করতে বা মানটি আপডেট করার সুবিধার্থে নীচের এক্সটেনশন পদ্ধতিটি দেখেছি, যদি কীটি ইতিমধ্যে বিদ্যমান থাকে।

পদ্ধতি -১ (উত্তরাধিকারের কোড)।

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{            
    if (map.ContainsKey(key))
    {
        map[key] = value;
    }
    else
    {
        map.Add(key, value);
    }
}

যদিও, আমি যাচাই করেছি যে map[key]=value ঠিক একই কাজ করে। অর্থাত, এই পদ্ধতিটি নীচের পদ্ধতি -2 দিয়ে প্রতিস্থাপন করা যেতে পারে।

পদ্ধতি-2।

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
    map[key] = value;
}

এখন, আমার প্রশ্ন .. আমি যদি পদ্ধতি -২ দ্বারা পদ্ধতি -১ প্রতিস্থাপন করি তবে কোনও সমস্যা হতে পারে? এটি কোনও সম্ভাব্য দৃশ্যে ভেঙে যাবে?

এছাড়াও, আমি মনে করি এটি হ্যাশ টেবিল এবং অভিধানের মধ্যে পার্থক্য ছিল। হ্যাশ টেবিল কোনও আইটেম আপডেট করতে, বা অভিধান না করে সূচক ব্যবহার করে একটি নতুন আইটেম যুক্ত করার অনুমতি দেয় !! এই পার্থক্যটি কি সি #> 3.0 সংস্করণে মুছে ফেলা হয়েছে?

ব্যবহারকারী যদি একই কী-মানটি আবার প্রেরণ করে তবে এই পদ্ধতির উদ্দেশ্যটি খুব বেশি ব্যতিক্রম নয়, পদ্ধতিটি কেবল নতুন মান সহ এন্ট্রি আপডেট করতে হবে এবং যদি নতুন কী-মান জোড় পদ্ধতিতে প্রেরণ করা হয়েছে তবে একটি নতুন এন্ট্রি করা উচিত ।

উত্তর:


243

আমি যদি পদ্ধতি -২ দ্বারা পদ্ধতি -১ প্রতিস্থাপন করি তবে কোনও সমস্যা হতে পারে?

না, শুধু ব্যবহার করুন map[key] = value। দুটি বিকল্প সমতুল্য।


সংক্রান্ত Dictionary<>বনাম Hashtable: আপনি যখন প্রতিফলক শুরু, আপনি দেখতে উভয় ক্লাস indexer setters কল this.Insert(key, value, add: false);এবং addপরামিতি একটি ব্যতিক্রম নিক্ষেপ, যখন একটি ডুপ্লিকেট চাবি ঢোকাতে জন্য দায়ী। সুতরাং আচরণ উভয় শ্রেণীর জন্য এক রকম।


44

কোনও সমস্যা নেই আমি CreateNewOrUpdateExistingউত্স থেকে এমনকি অপসারণ করব এবং map[key] = valueসরাসরি আপনার কোডে ব্যবহার করব , কারণ এটি অনেক বেশি পাঠযোগ্য, কারণ বিকাশকারীরা সাধারণত তার map[key] = valueঅর্থ বুঝতে পারে ।


22

পুরানো প্রশ্ন তবে আমি অনুভব করি যে আমার নিম্নলিখিতগুলি যুক্ত করা উচিত, আরও বেশি কারণ প্রশ্নটি লেখার সময়। নেট 4.0 ইতিমধ্যে চালু হয়েছিল।

.NET 4.0 দিয়ে শুরু করে নেমস্পেস System.Collections.Concurrentরয়েছে যার মধ্যে থ্রেড-নিরাপদ সংগ্রহ রয়েছে।

সংগ্রহটি System.Collections.Concurrent.ConcurrentDictionary<>আপনি যা চান ঠিক তেমন করে। AddOrUpdate()থ্রেড-সেফ হওয়ার অতিরিক্ত সুবিধা সহ এটির পদ্ধতি রয়েছে।

আপনি যদি উচ্চ-পারফরম্যান্সের দৃশ্যে থাকেন এবং একাধিক থ্রেড পরিচালনা করছেন না তবে ইতিমধ্যে প্রদত্ত উত্তরগুলি map[key] = valueদ্রুত।

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

  1. এটি কাঠামোর মধ্যে রয়েছে - এটি আরও পরীক্ষিত এবং আপনি কোডটি বজায় রাখতে হবে এমন কেউ নন
  2. এটি স্কেলযোগ্য: আপনি যদি মাল্টিথ্রেডিংয়ে স্যুইচ করেন তবে আপনার কোডটি এর জন্য ইতিমধ্যে প্রস্তুত

7

কার্যকরীভাবে, তারা সমতুল্য।

পারফরম্যান্স-ভিত্তিক map[key] = valueদ্রুত হবে, কারণ আপনি কেবল দু'জনের পরিবর্তে একক অনুসন্ধান করছেন।

স্টাইল অনুসারে, খাটো আরও কম :)

কোডটি বেশিরভাগ ক্ষেত্রে মাল্টি-থ্রেড প্রসঙ্গে ভাল কাজ করবে বলে মনে হচ্ছে। তবে হয় না অতিরিক্ত সিঙ্ক্রোনাইজেশন ছাড়া থ্রেড-নিরাপদ।

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