Chemistry and Dictionary(of TKey, TValue)

In college I majored in polymer chemistry and I thought I would use some of that chemistry today to demonstrate how to use Dictionary(of TKey, TValue) (VB.NET), Dictionary<TKey, TValue> (C#) class. The generic Dictionary(of TKey, TValue) class is a commonly used generic collection class that relies on a HashTable data structure to store keys and values, it is very fast and efficient.  The dictionary class implements both generic and non-generic IDictionary interfaces.

A generic Dictionary class works by accepting a key , and an object.  Keys can be any datatype, but I will be using a string for these examples. The key is used to retrieve the object after the collection has been built.  The object can be a value type or reference type such as a string, an integer or a custom object like an Atom class.

For these examples I created a class called Atom to represent an element on the periodic table.  This class is composed of several properties that define what an atom is.  I also took the time to override the ToString() method to return a custom string defining what the atom is.  To execute the examples I created a simple console application and added a few atoms to a periodic table Dictionary.

Public

Class

Atom

Private

_elementName

As

String

Public

Property

ElementName()

As

String

Get

Return

_elementName

End

Get

Set

(

ByVal

Value

As

String

) _elementName = Value

End

Set

End

Property

Private

_symbol

As

String

Public

Property

Symbol()

As

String

Get

Return

_symbol

End

Get

Set

(

ByVal

Value

As

String

) _symbol = Value

End

Set

End

Property

Private

_electrons

As

Integer

Public

Property

Electrons()

As

Integer

Get

Return

_electrons

End

Get

Set

(

ByVal

Value

As

Integer

) _electrons = Value

End

Set

End

Property

Private

_protons

As

Integer

Public

Property

Protons()

As

Integer

Get

Return

_protons

End

Get

Set

(

ByVal

Value

As

Integer

) _protons = Value

End

Set

End

Property

Private

_neutron

As

Integer

Public

Property

Neutron()

As

Integer

Get

Return

_neutron

End

Get

Set

(

ByVal

Value

As

Integer

) _neutron = Value

End

Set

End

Property

Public

ReadOnly

Property

AtomicNumber()

As

Integer

Get

Return

Protons

End

Get

End

Property

Public

ReadOnly

Property

MassNumber()

As

Integer

Get

Return

Protons + Neutron

End

Get

End

Property

Public

Overrides

Function

ToString()

As

String

Return

String

.Format(

"{0} has an Atomic Number of {1} and a Symbol of {2}."

, ElementName, AtomicNumber, Symbol)

End

Function

Private

_elementType

As

String

''' <summary>

''' Akali, Alkaline, Tansition, Halogen, Noble Gas, Lanthanide, Actinide

''' </summary>

''' <value></value>

''' <returns></returns>

''' <remarks></remarks>

Public

Property

ElementType()

As

String

Get

Return

_elementType

End

Get

Set

(

ByVal

Value

As

String

) _elementType = Value

End

Set

End

Property

Public

Sub

New

(

ByVal

vElementName

As

String

,

ByVal

vSymbol

As

String

,

ByVal

vElectrons

As

Integer

, _

ByVal

vProtons

As

Integer

,

ByVal

vNeutrons

As

Integer

,

ByVal

vElementType

As

String

) ElementName = vElementName Symbol = vSymbol Electrons = vElectrons Protons = vProtons Neutron = vNeutrons ElementType = vElementType

End

Sub

End

Class

The first example echoes the number of atoms, or objects, in the dictionary.  This is done with a console.WriteLine method call and the Dictionary's count method.

Module

Module1

Sub

Main()

Dim

periodicTable

As

New

Dictionary(Of

String

, Atom) periodicTable.Add(

"H"

,

New

Atom(

"Hydrogen"

,

"H"

, 1, 1, 0,

"Alkali"

)) periodicTable.Add(

"C"

,

New

Atom(

"Carbon"

,

"C"

, 6, 6, 6,

"Metal"

)) periodicTable.Add(

"O"

,

New

Atom(

"Oxygen"

,

"O"

, 8, 8, 8,

"Metal"

)) Console.WriteLine(

String

.Format(

"There are {0} elements."

, periodicTable.Count)) Console.WriteLine(

"..."

) Console.ReadKey()

End

Sub

End

Module

To add an atom to the dictionary call the add() method, passing the element's symbol, such as 'H',  and a new Atom to object.  Notice I created the Atom's using the custom constructor. I added hydrogen, carbon and oxygen to the dictionary, therefore there are three atoms in the dictionary.  The count method returns 3, which we see by executing the application.

In the next example we will see how to retrieve an object based on its key.  This is done by calling the ContainsKey() method, passing in the key assigned to the object.  If the key exist in the Dictionary, ContainsKey() returns true.  If the key does not exist and the Dictionary it returns false.

Console.WriteLine(

String

.Format(

"The Dictionary Contains does {0}Carbon."

, _

If

(periodicTable.ContainsKey(

"C"

),

""

,

"not "

)))Console.WriteLine(

String

.Format(

"The Dictionary Contains does {0}Floride."

, _

If

(periodicTable.ContainsKey(

"F"

),

""

,

"not "

)))Console.WriteLine(

"..."

)

We can also request a symbol to look up at the command line and pass it to the ContainsKey() method.  This opens up our little application to user input.

Console.WriteLine(

"Enter a Symbol to Lookup - "

)

Dim

ki

As

ConsoleKeyInfo = Console.ReadKey()Console.WriteLine(

""

)Console.WriteLine(

String

.Format(

"The Dictionary Contains does {0}{1}."

, _

If

(periodicTable.ContainsKey(ki.KeyChar),

""

,

"not "

), ki.KeyChar))Console.WriteLine(

"..."

)

Finally, I want to show how to retrieve for the object from the dictionary.  To do this I will iterate over the dictionary with a for each loop.  In the foreach loop I will create a new element based on the KeyValuePair stored in the Dictionary.  The KeyValuePair has two properties of interest the key, and the value.  The value can be cast to and atom object.  Once we have an actual object we can call the ToString method to get a description of the Atom.

For

Each

element

As

KeyValuePair(Of

String

, Atom)

In

periodicTable Console.WriteLine(

String

.Format(

"{0} - {1}"

, element.Key, _

DirectCast

(element.Value, Atom).ToString))

Next

Console.WriteLine(

"..."

)Console.ReadKey()

I hope these demonstrations give you a better idea of how to use the Dictionary(of TKey, TValue) class to store a list of items they can be easily retrieved by the key.  This class is extremely efficient for retrieving objects by key values, thus making searches easier than with a flat generic list class, List(of T).

Share This Article With Your Friends!