Skip to main content

Indexers in C#

Definition of Indexers from MSDN
Indexers allow instances of a class or struct to be indexed just like arrays. Indexers resemble properties except that their accessors take parameters.

Whenever you are accessing individual element from List<T> or Hashtable<T,T> etc you are using Indexers.
For example
List<string> str=new List<string>();
str.Add("Rameez");
str.Add("Usmani");
string firstName=str[0];  //[0] is implying that you are calling indexer on instance of List class

How Indexer is added to a class

To add an indexer to a class you have to expose a property named "this(actually a keyword)" followed by "data type of index" in square brackets. Like this
public ReturnDataType this[indexDataType]
{
    get { //logic to return the correct value }
    set { //logic to set the correct value }
}
Lets say you have collection of Students and you want to access Student by name using Indexer , here is how it can be done

public Student this[string Name]
{
    get
    {
         Student std=GetFromCollectionByName(Name);
         return std;
    }
}

To understand how to implement indexers we will create a class as an example. We will make a class University which has collection of Departments (DepartmentCollection) . DepartmentCollection class will expose indexer to retrieve department by name or index.

Here it is how
public class Department
{
    public string Name {get;set;}
    public string Code {get;set;}
}
public class DepartmentCollection
{
    private List<Department> depts=new List<Department>(); 
    public Department this[string dpName]
    {
        get
        {
             for (int a=0;a<depts.Count;a++)
             {
                  if (depts[a].Name.CompareTo(dpName)==0)
                  {
                       return depts[a];
                  }
             }
             return null;
        }
    } 
    public Department this[int dpIndex]
    {
        get
        {
             return depts[dpIndex];
        }
    }
public class University
{
    private DepartmentCollection depts=new DepartmentCollection(); 
    public DepartmentCollection Departments
    {
        get { return depts; }
    }
}
Now lets see how simply we can access a department in a University class. Right now for simplicity we are not concerned how Departments collection is filled.
University ui=new University();
 Department dept=ui.Departments[0];
//or
Department dept=ui.Departments["CSIT"];

More about Indexers
Indexers (C# Programming Guide) - MSDN
Using Indexers (C# Programming Guide) - MSDN
Comparisons Between Properties and Indexers (C# Programming Guide) - MSDN

Comments