Dictionaries are generic, meaning that the type of the key and value can be specified when the Dictionary is created. This makes Dictionaries type-safe and helps avoid errors. Hashtables, on the other hand, are non-generic, meaning that the type of the key and value are not specified when the Hashtable is created. This can make Hashtables more flexible, but it can also lead to errors.
Another key difference between Dictionaries and Hashtables is that Dictionaries maintain the order of the key-value pairs while Hashtables do not. This means that when we iterate over a Dictionary, the key-value pairs will be returned in the order in which they were added. When we iterate over a Hashtable, the order of the key-value pairs is not guaranteed.
Let’s now look at two different coding examples showing the usage of both Dictionaries and Hashtables.
Here is the C# program to illustrate the usage of a Dictionary to store key-value pairs:
using System;using System.Collections.Generic;class Educative {static public void Main(){// Creating a dictionary// using Dictionary<TKey, TValue> classDictionary<string, int> this_dict = new Dictionary<string, int>();// Adding key/value pairs in the Dictionary// Using Add() methodthis_dict.Add("a", 1);this_dict.Add("b", 2);this_dict.Add("c", 3);foreach(KeyValuePair<string, int> element in this_dict){Console.WriteLine("Key:- {0} and Value:- {1}",element.Key, element.Value);}}}
Line 12: We create a Dictionary named this_dict
that stores key-value pairs where the keys are of type string
and values are of type int
.
Lines 16–18: We add key-value pairs to the Dictionary using the Add
method.
Lines 20–24: We use a loop that iterates through each key-value pair in the Dictionary using KeyValuePair<string, int>
and prints the key and value to the console.
Here is the C# program to illustrate the usage of a Hashtable to store key-value pairs:
using System;using System.Collections;class Educative {static public void Main(){// Create a hashtableHashtable this_hashtable = new Hashtable();this_hashtable.Add("a", 1);this_hashtable.Add("b", 2);this_hashtable.Add("c", 3);foreach(DictionaryEntry element in this_hashtable){Console.WriteLine("Key:- {0} and Value:- {1} ",element.Key, element.Value);}}}
Line 10: We create a Hashtable named this_hashtable
that can store key-value pairs. The types of keys and values can be different, as Hashtable
is not type-safe.
Lines 12–14: We add key-value pairs to the Hashtable using the Add
method.
Lines 16–20: We use a loop that iterates through each key-value pair in the Hashtable using DictionaryEntry
The first code uses a generic
Dictionary<string, int>
, which ensures compile-time type safety by specifying that keys must be strings and values must be integers. This prevents runtime errors and avoids the overhead of boxing and unboxing, making it more efficient when dealing with value types likeint
. In contrast, the second code uses a non-genericHashtable
, which lacks type safety and incurs performance costs due to boxing and unboxing, leading to potential runtime issues and slower execution.
Dictionary is preferred over Hashtable in C# for the following reasons:
Type safety: The Dictionary is generic, meaning that you must specify the types for both the keys and values when creating it. This enforces type safety, ensuring that only the correct types of data are stored and preventing runtime errors. In contrast, a Hashtable is non-generic, meaning it can store any type of data, such as different key and value types. However, this lack of type safety can lead to runtime errors if the wrong data types are used during retrieval or manipulation, as typecasting is required.
Performance: The Dictionary is generally faster than Hashtable because it is strongly typed and avoids the overhead of boxing and unboxing. Since Hashtable is non-generic and stores data as object types, value types need to be boxed when added to the Hashtable and unboxed when retrieved, which introduces additional processing and memory overhead. In contrast, Dictionary is generic and operates on specified types directly, avoiding this overhead, making it faster for storing and retrieving data.
In addition, the Dictionary class was designed later and optimizes certain operations compared to the older Hashtable, such as the way collisions are handled. Both still use hash tables internally for efficient data storage and retrieval, but the type safety and optimized design give Dictionary a performance edge in most cases.
Maintainability: Dictionary code is generally more maintainable than Hashtable code. This is because the Dictionary is a newer type designed to be easier to use. Hashtable is an older type and can be more difficult to use correctly.
Overall, Dictionary is the preferred type for storing key-value pairs in C#. It is type-safe, performant, and maintainable.
Free Resources