C# Indexer

Summary: in this tutorial, you’ll learn how to use the C# indexer to make an object indexed like an array.

Introduction to the C# indexer

An index allows an object of a class to be indexed like an array. To define an indexer for a class, you use the following syntax:

class MyClass { public type this[int index] { get { // return a value } set { // assing a value } } }Code language: C# (cs)

The syntax of an indexer is like a property except that its accessor takes a parameter:

  • First, define the type of the return value.
  • Second, define the indexer using the use this keyword.
  • Third, define a parameter of the indexer. The parameter doesn’t have to be an integer. The parameter’s type depends on how you design the look-up mechanism. Also, an indexer can have more than one parameter.
  • Finally, define the get and set accessors. The get accessor returns a value while the set accessor assigns a value. If the indexer doesn’t have the set accessor, it’s a readonly indexer.

Note that indexers can be overloaded. In other words, a class can have multiple indexers.

If you omit the set accessor, the indexer becomes read-only. In this case, you can use expression-bodied syntax to shorten its definition:

class MyClass { public type this[int index] => returnValue; }Code language: C# (cs)

Note that you don’t need to use the get keyword.

Starting with C# 7, you can use expression-bodied syntax for both get and set accessors. However, you need to use the get and set keywords in this case:

class MyClass { public type this[int i] { get => member[i]; set => member[i] = value; } }Code language: C# (cs)

C# indexer examples

Let’s take some examples of using indexers.

1) C# readonly indexer example

Suppose you have a sentence like the following:

"C# is awesome"Code language: C# (cs)

And you want to access each word of the sentence using an index. For example:

sentence[0]Code language: C# (cs)

It should return the first word (C#), not the first character (C):

"C#"Code language: C# (cs)

To do that, you can define a new class and use an indexer.

First, create a new file called Sentence.cs.

Second, define the Sentence class in the Sentence.cs file:

// Sentence.cs class Sentence { private string[] words; public Sentence(string s) { words = s.Split(' '); } }Code language: C# (cs)

The Sentence() constructor splits an input string by the space into words and assigns the result to the words field.

Third, define an indexer in the Sentence class:

// Sentence.cs class Sentence { private string[] words; public Sentence(string s) { words = s.Split(' '); } public string this[int index] { get { return words[index]; } } }Code language: C# (cs)

In this example, the indexer returns the word in the sentence based on an index.

The following illustrates how to use the indexer of the sentence’s object:

// Program.cs var sentence = new Sentence("C# is awesome"); Console.WriteLine(sentence[0]); Console.WriteLine(sentence[1]); Console.WriteLine(sentence[2]);Code language: C# (cs)

Output:

C# is awesomeCode language: C# (cs)

Because the indexer in the Sentence class is read-only, you can shorten it using the expression-bodied syntax like this:

// Sentence.cs class Sentence { private string[] words; public Sentence(string s) { words = s.Split(' '); } public string this[int index] => words[index]; }Code language: C# (cs)

2) C# indexer example with set and get accessors

The following example defines the class Matrix that uses a multidimensional array as a field and an indexer to access its elements:

// Matrix.cs class Matrix { private double[,] data; public Matrix(int row, int column) { data = new double[row, column]; } public double this[int row, int column] { get { return data[row, column]; } set { data[row, column] = value; } } }Code language: JavaScript (javascript)

Now, you can use the Matrix’s object like an array like this:

// Program.cs var matrix = new Matrix(3,3); for (int row = 0; row < 3; row++) { for (int column = 0; column < 3; column++) { matrix[row, column] = row + column; } } for (int row = 0; row < 3; row++) { for (int column = 0; column < 3; column++) { Console.Write($"{matrix[row, column]} "); } Console.WriteLine(); } Code language: JavaScript (javascript)

Output:

0 1 2 1 2 3 2 3 4

Note that you can use the expression-bodied syntax for the get and set accessors of the indexer.

Summary

  • Use C# indexer to enable an object to be indexed like an array.
Was this tutorial helpful ?