Easy Tutorial
❮ Csharp Operators Csharp Event ❯

C# Indexer

Indexer allows an object to be accessed using subscript notation, similar to an array.

When you define an indexer for a class, the class behaves like a virtual array. You can access the members of the class using the array access operator [ ].

Syntax

The syntax for a one-dimensional indexer is as follows:

element-type this[int index] 
{
   // get accessor
   get 
   {
      // return the value specified by index
   }

   // set accessor
   set 
   {
      // set the value specified by index
   }
}

Usage of Indexer

The declaration of the indexer's behavior is somewhat similar to properties. Like properties, you can use get and set accessors to define an indexer. However, properties return or set a specific data member, while an indexer returns or sets a specific value for an instance of the object. In other words, it breaks instance data into smaller parts and indexes each part, getting or setting each part.

Defining a property involves providing a property name. An indexer is defined without a name but with the this keyword, which points to the object instance. The following example demonstrates this concept:

Example

using System;
namespace IndexerApplication
{
   class IndexedNames
   {
      private string[] namelist = new string[size];
      static public int size = 10;
      public IndexedNames()
      {
         for (int i = 0; i < size; i++)
         namelist[i] = "N. A.";
      }
      public string this[int index]
      {
         get
         {
            string tmp;

            if( index >= 0 && index <= size-1 )
            {
               tmp = namelist[index];
            }
            else
            {
               tmp = "";
            }

            return ( tmp );
         }
         set
         {
            if( index >= 0 && index <= size-1 )
            {
               namelist[index] = value;
            }
         }
      }

      static void Main(string[] args)
      {
         IndexedNames names = new IndexedNames();
         names[0] = "Zara";
         names[1] = "Riz";
         names[2] = "Nuha";
         names[3] = "Asif";
         names[4] = "Davinder";
         names[5] = "Sunil";
         names[6] = "Rubic";
         for ( int i = 0; i < IndexedNames.size; i++ )
         {
            Console.WriteLine(names[i]);
         }
         Console.ReadKey();
      }
   }
}

When the above code is compiled and executed, it produces the following result:

Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.

Overloading Indexer

Indexers can be overloaded. Indexers can also be declared with multiple parameters, and each parameter can be of a different type. It is not necessary for indexers to be integer types. C# allows indexers to be of other types, such as string.

The following example demonstrates overloading an indexer:

Example

using System;
namespace IndexerApplication
{
   class IndexedNames
   {
      private string[] namelist = new string[size];
      static public int size = 10;
      public IndexedNames()
      {
         for (int i = 0; i < size; i++)
         namelist[i] = "N. A.";
      }
      public string this[int index]
      {
         get
         {
            string tmp;

            if( index >= 0 && index <= size-1 )
            {
               tmp = namelist[index];
            }
            else
            {
               tmp = "";
            }

            return ( tmp );
         }
         set
         {
            if( index >= 0 && index <= size-1 )
            {
               namelist[index] = value;
            }
         }
      }
      public int this[string name]
      {
         get
         {
            int index = 0;
            while(index < size)
            {
               if(namelist[index] == name)
               {
                return index;
               }
               index++;
            }
            return -1;
         }
      }

      static void Main(string[] args)
      {
         IndexedNames names = new IndexedNames();
         names[0] = "Zara";
         names[1] = "Riz";
         names[2] = "Nuha";
         names[3] = "Asif";
         names[4] = "Davinder";
         names[5] = "Sunil";
         names[6] = "Rubic";
         //using the first indexer with int parameter
         for (int i = 0; i < IndexedNames.size; i++)
         {
            Console.WriteLine(names[i]);
         }
         //using the second indexer with string parameter
         Console.WriteLine(names["Nuha"]);
         Console.ReadKey();
      }
   }
}

When the above code is compiled and executed, it produces the following result:

Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
2
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames()
{
   for (int i = 0; i < size; i++)
   {
      namelist[i] = "N. A.";
   }
}
public string this[int index]
{
   get
   {
      string tmp;

      if( index >= 0 && index <= size-1 )
      {
         tmp = namelist[index];
      }
      else
      {
         tmp = "";
      }

      return ( tmp );
   }
   set
   {
      if( index >= 0 && index <= size-1 )
      {
         namelist[index] = value;
      }
   }
}
public int this[string name]
{
   get
   {
      int index = 0;
      while(index < size)
      {
         if (namelist[index] == name)
         {
            return index;
         }
         index++;
      }
      return index;
   }

}

static void Main(string[] args)
{
   IndexedNames names = new IndexedNames();
   names[0] = "Zara";
   names[1] = "Riz";
   names[2] = "Nuha";
   names[3] = "Asif";
   names[4] = "Davinder";
   names[5] = "Sunil";
   names[6] = "Rubic";
   // Using the first indexer with int parameter
   for (int i = 0; i < IndexedNames.size; i++)
   {
      Console.WriteLine(names[i]);
   }
   // Using the second indexer with string parameter
   Console.WriteLine(names["Nuha"]);
   Console.ReadKey();
}
}

When the above code is compiled and executed, it produces the following result:

Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
2
❮ Csharp Operators Csharp Event ❯