Some of this stuff you may have already heard about, but I thought I would touch on some stuff regarding generics.  The dictionary object is an object that can take many different data types for both it's key and value.
Here is example of how one is declared:
Dictionary<string, VehicleDataSet> vehicleDataSetDictionary = new Dictionary<string, VehicleDataSet>();
In this case a string is the key (i.e.: PickupLocationCode) and it is taking a typed dataset as a value.
Before you might have had to do something like this to retrieve data:
int CarModelId = ((VehicleDataSet) vehicleDataSetHashTable["LAX"]).CarModelId;
That's a bad time.
The dictionary object will let you use retrieve an item from the dictionary without boxing.
int carModelId = vehicleDataSetDictionary["LAX"].CarModelId;
Notice, that there is no casting required.
Note: If you want to verify that the key is valid before accessing an item in the dictionary object, simply use the ContainsKey() method.  This is necessary otherwise you will throw an exception.
if (vehicleDataSetDictionary.ContainsKey(locationCode))
   return vehicleDataSetDictionary[locationCode];
Lastly there are a ton of new generic collections available in the System.Collections.Generics namespace: List, LinkedList, Queue, SortedDictionary, Stack, etc.

Read the complete post at