কম্পিউটার টিউটোরিয়াল

C#-তে OrderedDictionary-র শুধুমাত্র পঠনযোগ্য (Read-Only) কপি পেতে AsReadOnly() মেথড ব্যবহার

OrderedDictionary ক্লাসের AsReadOnly() মেথড ডিকশনারির একটি শুধুমাত্র পঠনযোগ্য (read-only) র‍্যাপার রিটার্ন করে। এই র‍্যাপারের মাধ্যমে মূল ডিকশনারি মডিফাই করা যায় না (Add, Remove, Clear, সেটার ব্লকড), কিন্তু মূল ডিকশনারি পরিবর্তন হলে র‍্যাপারে প্রতিফলিত হয়।

উদাহরণ ১: দুটি OrderedDictionary এবং AsReadOnly()

using System;
using System.Collections;
using System.Collections.Specialized;

public class Demo {
    public static void Main() {
        OrderedDictionary dict1 = new OrderedDictionary();
        dict1.Add("A", "বই");
        dict1.Add("B", "ইলেকট্রনিক্স");
        dict1.Add("C", "স্মার্ট ওয়েয়ারেবল");
        dict1.Add("D", "পেট সাপ্লাই");
        dict1.Add("E", "পোশাক");
        dict1.Add("F", "ফুটওয়েয়ার");

        Console.WriteLine("OrderedDictionary1 উপাদানসমূহ...");
        foreach (DictionaryEntry d in dict1) {
            Console.WriteLine(d.Key + " " + d.Value);
        }

        OrderedDictionary dict2 = new OrderedDictionary();
        dict2.Add("1", "এক");
        dict2.Add("2", "দুই");
        dict2.Add("3", "তিন");
        dict2.Add("4", "চার");
        dict2.Add("5", "পাঁচ");
        dict2.Add("6", "ছয়");

        Console.WriteLine("\nOrderedDictionary2 উপাদানসমূহ...");
        foreach (DictionaryEntry d in dict2) {
            Console.WriteLine(d.Key + " " + d.Value);
        }

        Console.WriteLine("\nOrderedDictionary1 == OrderedDictionary2? = " + dict1.Equals(dict2));  // False

        // Read-only র‍্যাপার তৈরি
        OrderedDictionary orderedDict = dict2.AsReadOnly();

        Console.WriteLine("OrderedDictionary রিড-অনলি কিনা? = " + orderedDict.IsReadOnly);  // True

        // নিচের লাইন কম্পাইল টাইম এরর দেবে (রানটাইমে NotSupportedException):
        // orderedDict.Add("7", "সাত");
        // orderedDict.Remove("1");
        // orderedDict.Clear();
    }
}

আউটপুট

OrderedDictionary1 উপাদানসমূহ...
A বই
B ইলেকট্রনিক্স
C স্মার্ট ওয়েয়ারেবল
D পেট সাপ্লাই
E পোশাক
F ফুটওয়েয়ার

OrderedDictionary2 উপাদানসমূহ...
1 এক
2 দুই
3 তিন
4 চার
5 পাঁচ
6 ছয়

OrderedDictionary1 == OrderedDictionary2? = False
OrderedDictionary রিড-অনলি কিনা? = True

উদাহরণ ২: সরাসরি AsReadOnly() ব্যবহার

using System;
using System.Collections;
using System.Collections.Specialized;

public class Demo {
    public static void Main() {
        OrderedDictionary dict = new OrderedDictionary();
        dict.Add("A", "বই");
        dict.Add("B", "ইলেকট্রনিক্স");
        dict.Add("C", "স্মার্ট ওয়েয়ারেবল");
        dict.Add("D", "পেট সাপ্লাই");
        dict.Add("E", "পোশাক");
        dict.Add("F", "ফুটওয়েয়ার");

        Console.WriteLine("OrderedDictionary উপাদানসমূহ...");
        foreach (DictionaryEntry d in dict) {
            Console.WriteLine(d.Key + " " + d.Value);
        }

        OrderedDictionary orderedDict = dict.AsReadOnly();
        Console.WriteLine("OrderedDictionary রিড-অনলি কিনা? = " + orderedDict.IsReadOnly);  // True
    }
}

আউটপুট

OrderedDictionary উপাদানসমূহ...
A বই
B ইলেকট্রনিক্স
C স্মার্ট ওয়েয়ারেবল
D পেট সাপ্লাই
E পোশাক
F ফুটওয়েয়ার
OrderedDictionary রিড-অনলি কিনা? = True

AsReadOnly() - গুরুত্বপূর্ণ বৈশিষ্ট্য

  • রিটার্ন টাইপ: OrderedDictionary (সেইম টাইপ, কিন্তু IsReadOnly = true)
  • র‍্যাপার প্যাটার্ন: মূল ডিকশনারিকে র‍্যাপ করে, কপি তৈরি করে না।
  • লাইভ ভিউ: মূল ডিকশনারি পরিবর্তন হলে র‍্যাপারে পরিবর্তন দেখা যায়।
  • মডিফিকেশন ব্লকড: Add, Remove, Clear, Item setter কল করলে NotSupportedException নিক্ষেপ করে।
  • এনুমারেশন: foreach, Keys, Values, GetEnumerator() কাজ করে।

রিড-অনলি ডিকশনারি তৈরির অন্যান্য পদ্ধতি

// ১. ReadOnlyDictionary (জেনেরিক, সুপারিশকৃত)
using System.Collections.Generic;
using System.Collections.ObjectModel;

var dict = new Dictionary<string, string>();
dict.Add("A", "বই");
var readOnly = new ReadOnlyDictionary<string, string>(dict);

// ২. ImmutableDictionary (System.Collections.Immutable NuGet প্যাকেজ)
using System.Collections.Immutable;
var immutable = dict.ToImmutableDictionary();  // সম্পূর্ণ ইমিউটেবল, কপি তৈরি হয়

// ৩. IReadOnlyDictionary ইন্টারফেস (প্যারামিটার টাইপ হিসেবে)
void PrintDict(IReadOnlyDictionary<string, string> dict) { ... }

তুলনা: AsReadOnly() vs ReadOnlyDictionary vs ImmutableDictionary

বৈশিষ্ট্যOrderedDictionary.AsReadOnly()ReadOnlyDictionary<TKey,TValue>ImmutableDictionary<TKey,TValue>
টাইপ সেফটিনন-জেনেরিকজেনেরিকজেনেরিক
মুল ডিকশনারি পরিবর্তনর‍্যাপারে প্রতিফলিত হয়র‍্যাপারে প্রতিফলিত হয়নहीं (স্ন্যাপশট)
পারফরম্যান্সওভারহেড নেইওভারহেড নেইকপি ওভারহেড
থ্রেড-সেফনা (মুল ডিকশনারি থ্রেড-সেফ নয়)না (মুল ডিকশনারি থ্রেড-সেফ নয়)হ্যাঁ (ইমিউটেবল)

সুপারিশ: নতুন কোডে Dictionary<TKey, TValue> + ReadOnlyDictionary<TKey, TValue> বা ImmutableDictionary<TKey, TValue> ব্যবহার করুন। OrderedDictionary লিগ্যাসি নন-জেনেরিক ক্লাস।

  1. C#-এ List-এ ইনুমেরেটর পাওয়া (GetEnumerator)

  2. C#-এ OrderedDictionary-এ মানগুলির ICollection পাওয়া (Values প্রপার্টি)

  3. C#-এ লিস্ট থেকে রেঞ্জ অনুযায়ী উপাদান পাওয়া

  4. C#-এ Dictionary থেকে কীগুলোর লিস্ট পাওয়া