📖 Scenario: Imagine you manage a small hotel with rooms on different floors. You want to keep track of which guest is staying in each room using a simple system.
🎯 Goal: You will create a class with a multi-parameter indexer that lets you get and set guest names by specifying the floor and room number.
📋 What You'll Learn
Create a class called Hotel that stores guest names.
Use a multi-parameter indexer with two int parameters: floor and room.
The indexer should allow getting and setting guest names by floor and room.
Demonstrate setting and getting guest names using the indexer.
💡 Why This Matters
🌍 Real World
Multi-parameter indexers are useful when you want to access data stored in a grid or table-like structure, such as seats in a theater, cells in a spreadsheet, or rooms in a hotel.
💼 Career
Understanding multi-parameter indexers helps you write cleaner and more intuitive code when working with complex data structures, a common task in software development jobs.
Progress0 / 4 steps
1
Create the Hotel class with a 2D array
Create a class called Hotel with a private 2D string array called guests sized 3 floors by 5 rooms each. Initialize the array in the constructor.
C Sharp (C#)
Hint
Use a 2D array to store guest names by floor and room.
2
Add a multi-parameter indexer to the Hotel class
Inside the Hotel class, add a public indexer with two int parameters named floor and room. The indexer should get and set values in the guests array.
C Sharp (C#)
Hint
Use this[int floor, int room] to define the indexer with get and set accessors.
3
Create a Hotel object and assign guest names
In the Main method, create a Hotel object called myHotel. Use the indexer to assign "Alice" to floor 0, room 1 and "Bob" to floor 2, room 4.
C Sharp (C#)
Hint
Create the object and use the indexer with two numbers inside square brackets to assign names.
4
Print guest names using the multi-parameter indexer
In the Main method, add two Console.WriteLine statements to print the guests at floor 0, room 1 and floor 2, room 4 using the indexer on myHotel.
C Sharp (C#)
Hint
Use Console.WriteLine(myHotel[0, 1]) and Console.WriteLine(myHotel[2, 4]) to print the guest names.
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
Step 1: Understand what an indexer does
An indexer lets you access elements in a class like an array using keys.
Step 2: Identify the role of multiple parameters
Multi-parameter indexers allow using more than one key, like row and column in a table.
Final Answer:
To allow accessing elements using multiple keys like a table or matrix. -> Option A
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
Step 1: Recall indexer syntax
Indexers use the keyword this followed by square brackets with parameters separated by commas.
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.
Final Answer:
public int this[int x, int y] { get { return 0; } set { } } -> Option D
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
Step 1: Understand the data array
The 2D array data is {{1,2},{3,4}}. The first index is row, second is column.
Step 2: Access element at m[1, 0]
Row 1, column 0 is the second row, first column, which is 3.
Final Answer:
3 -> Option C
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
Step 1: Check parameter separator in indexer
Parameters in indexers must be separated by commas, not semicolons.
Step 2: Verify other parts
Return type is present, data array can be multi-dimensional, indexers are instance members by default.
Final Answer:
Using semicolon instead of comma between parameters in indexer. -> Option B
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
Step 1: Understand the data structure needed
We need a dictionary with a tuple key (student, subject) to store grades.
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.
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.
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