The .NET Framework provides a number of type-safe (generic) collections, including the list<t>, stack<t>, queue<t>, and dictionary<key><value>.
You are free to create your own generic collection types as well.
Generics allow the collection designer to create a single collection without regard to the type of object it will hold, but to allow the collection user to define, at compile time, which type the object will hold. This enlists the compiler in finding bugs; if you add an object of the wrong type to a collection, it will be found at compile time, not run time. It also eliminates the need for casting and for boxing and unboxing.
The .NET Framework provides a number of interfaces that collections must implement if they wish to act like the built-in collections (such as being iterated by a foreach loop).
An indexer allows you to access or assign objects to and from a collection just as you do with an array (for example, myCollection = "hello").
Indexers need not be restricted to integers. It is common to create indexers that take a string to assign or retrieve a value.
All framework collections implement the Sort( ) method. If you want to be able to sort a collection of objects of a user-defined type, however, the defining class must implement the IComparable interface.
The generic list collection, List<T>, works like an array whose size is increased dynamically as you add elements.
The Queue<T> class is a first-in, first-out collection.
The Stack<T> class is a last-in, first-out collection.
A dictionary<k,v> is a collection that associates a key with a value. Typically, the key is short, and the value is large.