Bird
Raised Fist0
C Sharp (C#)programming~5 mins

Multi-parameter indexers in C Sharp (C#)

Choose your learning style10 modes available
Introduction

Multi-parameter indexers let you access data using more than one key, like looking up a value by row and column in a table.

When you want to access elements in a grid or matrix using two numbers.
When you have a collection that needs two keys to find an item, like a calendar with year and month.
When you want to simplify code that uses multiple keys to get or set values.
When you want to make your class behave like a 2D array or table.
Syntax
C Sharp (C#)
public returnType this[type1 index1, type2 index2]
{
    get { /* return value based on index1 and index2 */ }
    set { /* set value based on index1 and index2 */ }
}

The keyword this defines the indexer.

You can use any number of parameters separated by commas inside the square brackets.

Examples
Indexer for a 2D integer matrix using row and column.
C Sharp (C#)
public int this[int row, int col]
{
    get { return matrix[row, col]; }
    set { matrix[row, col] = value; }
}
Indexer that looks up a person by first and last name.
C Sharp (C#)
public string this[string firstName, string lastName]
{
    get { return FindPerson(firstName, lastName); }
}
Sample Program

This program creates a 3x3 table and sets values at two positions using the multi-parameter indexer. Then it prints those values.

C Sharp (C#)
using System;

class Table
{
    private int[,] data = new int[3, 3];

    public int this[int row, int col]
    {
        get { return data[row, col]; }
        set { data[row, col] = value; }
    }
}

class Program
{
    static void Main()
    {
        Table table = new Table();
        table[0, 0] = 10;
        table[1, 2] = 20;
        Console.WriteLine(table[0, 0]);
        Console.WriteLine(table[1, 2]);
    }
}
OutputSuccess
Important Notes

Multi-parameter indexers make your class easier to use when working with multi-key data.

Indexers can have only get, only set, or both get and set accessors.

Be careful with index bounds to avoid runtime errors.

Summary

Multi-parameter indexers let you use more than one key to access data.

They make classes behave like multi-dimensional arrays or tables.

Use them to simplify code that needs multiple keys to find values.

Practice

(1/5)
1. What is the main purpose of a multi-parameter indexer in C#?
easy
A. To allow accessing elements using multiple keys like a table or matrix.
B. To create a method that returns multiple values.
C. To define multiple constructors in a class.
D. To overload operators for custom classes.

Solution

  1. Step 1: Understand what an indexer does

    An indexer lets you access elements in a class like an array using keys.
  2. Step 2: Identify the role of multiple parameters

    Multi-parameter indexers allow using more than one key, like row and column in a table.
  3. Final Answer:

    To allow accessing elements using multiple keys like a table or matrix. -> Option A
  4. Quick Check:

    Multi-parameter indexer = multiple keys access [OK]
Hint: Think of multi-parameter indexers as multi-key access [OK]
Common Mistakes:
  • Confusing indexers with methods returning multiple values
  • Thinking indexers define constructors
  • Mixing indexers with operator overloading
2. Which of the following is the correct syntax to declare a multi-parameter indexer in C#?
easy
A. public int this[int x; int y] { get { return 0; } set { } }
B. public int this(int x, int y) { get { return 0; } set { } }
C. public int this[int x][int y] { get { return 0; } set { } }
D. public int this[int x, int y] { get { return 0; } set { } }

Solution

  1. Step 1: Recall indexer syntax

    Indexers use the keyword this followed by square brackets with parameters separated by commas.
  2. Step 2: Check each option

    public int this[int x, int y] { get { return 0; } set { } } uses square brackets with comma-separated parameters, which is correct syntax.
  3. Final Answer:

    public int this[int x, int y] { get { return 0; } set { } } -> Option D
  4. Quick Check:

    Indexer syntax uses square brackets with commas [OK]
Hint: Use square brackets with commas for multiple parameters [OK]
Common Mistakes:
  • Using parentheses instead of square brackets
  • Separating parameters with semicolons
  • Trying to nest square brackets for parameters
3. What will be the output of this code snippet?
class Matrix {
  private int[,] data = new int[2,2] {{1,2},{3,4}};
  public int this[int x, int y] {
    get { return data[x, y]; }
    set { data[x, y] = value; }
  }
}

var m = new Matrix();
Console.WriteLine(m[1, 0]);
medium
A. 4
B. 2
C. 3
D. 1

Solution

  1. Step 1: Understand the data array

    The 2D array data is {{1,2},{3,4}}. The first index is row, second is column.
  2. Step 2: Access element at m[1, 0]

    Row 1, column 0 is the second row, first column, which is 3.
  3. Final Answer:

    3 -> Option C
  4. Quick Check:

    m[1,0] = 3 [OK]
Hint: Remember: first index = row, second = column [OK]
Common Mistakes:
  • Mixing row and column indices
  • Confusing array initialization syntax
  • Assuming zero-based indexing is off
4. Identify the error in this multi-parameter indexer declaration:
public class Table {
  private string[,] data = new string[3,3];
  public string this[int x; int y] {
    get { return data[x, y]; }
    set { data[x, y] = value; }
  }
}
medium
A. Missing return type for the indexer.
B. Using semicolon instead of comma between parameters in indexer.
C. Data array should be one-dimensional for indexers.
D. Indexer must be static.

Solution

  1. Step 1: Check parameter separator in indexer

    Parameters in indexers must be separated by commas, not semicolons.
  2. Step 2: Verify other parts

    Return type is present, data array can be multi-dimensional, indexers are instance members by default.
  3. Final Answer:

    Using semicolon instead of comma between parameters in indexer. -> Option B
  4. Quick Check:

    Parameters separated by commas, not semicolons [OK]
Hint: Separate indexer parameters with commas, not semicolons [OK]
Common Mistakes:
  • Using semicolons instead of commas
  • Thinking indexers must be static
  • Confusing array dimensions with indexer parameters
5. You want to create a class that stores grades for students in different subjects using a multi-parameter indexer. Which implementation correctly allows setting and getting grades by student name and subject?
hard
A. public class Grades { private Dictionary<(string, string), int> data = new(); public int this[string student, string subject] { get => data[(student, subject)]; set => data[(student, subject)] = value; } }
B. public class Grades { private Dictionary data = new(); public int this[string student, string subject] { get => data[student + subject]; set => data[student + subject] = value; } }
C. public class Grades { private Dictionary data = new(); public int this[string student] { get => data[student]; set => data[student] = value; } }
D. public class Grades { private Dictionary<(string, string), int> data = new(); public int this[string student; string subject] { get => data[(student, subject)]; set => data[(student, subject)] = value; } }

Solution

  1. Step 1: Understand the data structure needed

    We need a dictionary with a tuple key (student, subject) to store grades.
  2. Step 2: Check indexer syntax and dictionary usage

    public class Grades { private Dictionary<(string, string), int> data = new(); public int this[string student, string subject] { get => data[(student, subject)]; set => data[(student, subject)] = value; } } uses a tuple key dictionary and correct indexer syntax with comma-separated parameters.
  3. Step 3: Identify errors in other options

    public class Grades { private Dictionary data = new(); public int this[string student, string subject] { get => data[student + subject]; set => data[student + subject] = value; } } concatenates keys as string which can cause collisions; C uses only one parameter; D uses semicolon instead of comma in indexer.
  4. Final Answer:

    public class Grades { private Dictionary<(string, string), int> data = new(); public int this[string student, string subject] { get => data[(student, subject)]; set => data[(student, subject)] = value; } } -> Option A
  5. Quick Check:

    Tuple keys + comma-separated indexer = correct [OK]
Hint: Use tuple keys and commas in indexer parameters [OK]
Common Mistakes:
  • Concatenating keys as strings causing collisions
  • Using semicolons instead of commas in indexer
  • Using single-parameter indexer for multi-key data
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard