দ্রুত তুলনা
| বিষয় | Hashtable | Dictionary<TKey, TValue> |
| প্রকৃতি | নন-জেনেরিক (System.Collections) | জেনেরিক (System.Collections.Generic) |
| টাইপ সেফটি | না (object key/value) | হ্যাঁ (কম্পাইল টাইম চেক) |
| বক্সিং/আনবক্সিং | হ্যাঁ (ভ্যালু টাইপের জন্য) | না (স্ট্রাং টাইপড) |
| পারফরম্যান্স | धीম (বক্সিং ওভারহেড) | দ্রুত (নো বক্সিং) |
| Null কী | অনুমোদিত (একটি null key) | অনুমোদিত (একটি null key) |
| Null ভ্যালু | অনুমোদিত | অনুমোদিত (রেফারেন্স টাইপের জন্য) |
| অনuporation অর্ডার | মেইনটেইন করে না | ইনসারশন অর্ডার মেইনটেইন করে (`.NET Core 3.0+ / .NET 5+) |
| থ্রেড সেফিটি | Hashtable.Synchronized() দিয়ে র্যাপার | নেই (ConcurrentDictionary ব্যবহার করুন) |
Hashtable উদাহরণ (লিগেসি)
using System;
using System.Collections;
var ht = new Hashtable();
ht.Add(1, "One"); // int key
ht.Add("Two", 2); // string key, int value — মিক্সড টাইপ!
ht.Add("Key", null); // null value OK
foreach (DictionaryEntry entry in ht) {
Console.WriteLine($"Key: {entry.Key} ({entry.Key.GetType().Name}), Value: {entry.Value}");
}
// লুকআপ — কী না থাকলে null ফেরত দেয় (নো এক্সেপশন)
Console.WriteLine(ht[999]); // null
Dictionary উদাহরণ (আধুনিক, প্রস্তাবিত)
using System;
using System.Collections.Generic;
var dict = new Dictionary<int, string>();
dict.Add(1, "One");
dict.Add(2, "Two");
// dict.Add("Three", 3); // ❌ Compile error: টাইপ মিসম্যাচ
// লুকআপ — কী না থাকলে KeyNotFoundException
try {
var val = dict[999];
} catch (KeyNotFoundException) {
Console.WriteLine("Key not found");
}
// সেফ লুকআপ
if (dict.TryGetValue(2, out var val)) {
Console.WriteLine(val); // Two
}
// ইনসারশন অর্ডার মেইনটেইন (.NET Core 3.0+)
var ordered = new Dictionary<int, string> {
{ 3, "Three" }, { 1, "One" }, { 2, "Two" }
};
foreach (var kvp in ordered) {
Console.WriteLine($"{kvp.Key}: {kvp.Value}"); // 3, 1, 2 অর্ডারে
}
কেন Dictionary ভালো?
- টাইপ সেফটি: কম্পাইল টাইমে বাগ ধরা যায়
- পারফরম্যান্স: বক্সিং/আনবক্সিং নেই, জেনেরিক স্পেশালাইজেশন
- রিডেবিলিটি:
dict[int] vs (string)ht[1]
- LINQ সাপোর্ট: ফুল LINQ এক্সটেনশন মেথড
যখন Hashtable ব্যবহার করতে হয়?
- .NET Framework 1.x/2.x লিগেসি কোড মেইনটেইন করলে
- COM ইন্টারঅপ, পুরানো API যা Hashtable এক্সপেক্ট করে
- খুব পুরানো প্রজেক্টে মাইগ্রেশন না করতেই হলে
অন্যান্য বিকল্প
| কলেকশন | ব্যবহার |
ConcurrentDictionary<TKey,TValue> | থ্রেড-সেফ ডিকশনারি (মাল্টিথ্রেডেড) |
SortedDictionary<TKey,TValue> | সর্টেড কী (Red-Black Tree) |
SortedList<TKey,TValue> | সর্টেড কী, ইন্ডেক্স অ্যাক্সেস, কম মেমরি |
ImmutableDictionary<TKey,TValue> | ইমিউটেবল, থ্রেড-সেফ বাই ডিফল্ট |
FrozenDictionary<TKey,TValue> (.NET 8+) | রিড-ওনলি, অপ্টিমাইজড লুকআপ |
মাইগ্রেশন টিপস
// Hashtable → Dictionary
var dict = new Dictionary<string, object>();
foreach (DictionaryEntry entry in oldHashtable) {
dict[(string)entry.Key] = entry.Value;
}
// Dictionary → Hashtable (রেয়ার)
var ht = new Hashtable(dict); // Constructor accepte IDictionary