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

Indexer with custom types in C Sharp (C#) - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Indexer Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of indexer accessing custom type property

What is the output of this C# code?

C Sharp (C#)
public class Person {
    public string Name { get; set; }
    public Person(string name) { Name = name; }
}

public class Group {
    private Person[] people = { new Person("Alice"), new Person("Bob"), new Person("Charlie") };
    public Person this[int index] {
        get { return people[index]; }
        set { people[index] = value; }
    }
}

var group = new Group();
Console.WriteLine(group[1].Name);
AIndexOutOfRangeException
BCharlie
CBob
DAlice
Attempts:
2 left
💡 Hint

Remember that arrays are zero-based indexed.

❓ Predict Output
intermediate
2:00remaining
Indexer set accessor effect on custom type array

What will be printed after running this code?

C Sharp (C#)
public class Item {
    public int Value { get; set; }
    public Item(int value) { Value = value; }
}

public class Container {
    private Item[] items = { new Item(10), new Item(20), new Item(30) };
    public Item this[int index] {
        get => items[index];
        set => items[index] = value;
    }
}

var container = new Container();
container[1] = new Item(99);
Console.WriteLine(container[1].Value);
A99
B20
C10
DNullReferenceException
Attempts:
2 left
💡 Hint

Check what happens when you assign a new Item to the indexer.

🔧 Debug
advanced
2:00remaining
Identify the error in this indexer implementation

What error will this code produce when compiled?

C Sharp (C#)
public class Box {
    private int[] data = new int[3];
    public int this[int index] {
        get { return data[index]; }
        set { data[index] = value; }
    }
}
ASyntaxError: Cannot use parentheses to index an array
BIndexOutOfRangeException at runtime
CNo error, compiles and runs fine
DNullReferenceException at runtime
Attempts:
2 left
💡 Hint

Look carefully at how the array is accessed in the set accessor.

❓ Predict Output
advanced
2:00remaining
Output of indexer with custom struct type

What is the output of this code?

C Sharp (C#)
public struct Point {
    public int X, Y;
    public Point(int x, int y) { X = x; Y = y; }
    public override string ToString() => $"({X},{Y})";
}

public class Polygon {
    private Point[] points = { new Point(1,2), new Point(3,4), new Point(5,6) };
    public Point this[int index] {
        get => points[index];
        set => points[index] = value;
    }
}

var poly = new Polygon();
poly[2] = new Point(7,8);
Console.WriteLine(poly[2]);
ACompilation error
B(3,4)
C(5,6)
D(7,8)
Attempts:
2 left
💡 Hint

Remember structs are value types and can be replaced via indexer.

🧠 Conceptual
expert
2:00remaining
Why use indexers with custom types?

Which of the following is the best reason to implement an indexer with a custom type in C#?

ATo force all elements to be immutable and prevent changes
BTo allow accessing elements of a collection-like class using array syntax for better readability and encapsulation
CTo automatically serialize the class to JSON without extra code
DTo replace the need for constructors in the class
Attempts:
2 left
💡 Hint

Think about what indexers provide in terms of syntax and usage.

Practice

(1/5)
1.

What is the main purpose of an indexer in a C# class?

Choose the best description.

easy
A. To create a constructor for initializing objects.
B. To define a method that returns the size of a collection.
C. To allow objects to be accessed using array-like bracket syntax with custom keys.
D. To overload the + operator for custom types.

Solution

  1. Step 1: Understand what an indexer does

    An indexer lets you use square brackets [] to access elements inside an object, similar to arrays.
  2. Step 2: Identify the correct description

    Only To allow objects to be accessed using array-like bracket syntax with custom keys. describes this behavior correctly by mentioning bracket syntax and custom keys.
  3. Final Answer:

    To allow objects to be accessed using array-like bracket syntax with custom keys. -> Option C
  4. Quick Check:

    Indexer = bracket access [OK]
Hint: Indexers let you use [] on objects like arrays [OK]
Common Mistakes:
  • Confusing indexers with constructors
  • Thinking indexers define collection size
  • Mixing indexers with operator overloading
2.

Which of the following is the correct syntax to declare an indexer in a C# class using a custom type Key as the index?

public class MyCollection {
    // Indexer declaration here
}
easy
A. public string this[Key key] { get; set; }
B. public string this(Key key) { get; set; }
C. public string this[Key] { get; set; }
D. public string this[Key key] => get; set;

Solution

  1. Step 1: Recall indexer syntax

    Indexers use the keyword this followed by square brackets with the parameter type and name inside.
  2. Step 2: Check each option

    public string this[Key key] { get; set; } correctly uses this[Key key] with get and set accessors. Others have syntax errors or wrong brackets.
  3. Final Answer:

    public string this[Key key] { get; set; } -> Option A
  4. Quick Check:

    Indexer syntax = this[Type name] { get; set; } [OK]
Hint: Indexer uses this[Type name] with get/set inside braces [OK]
Common Mistakes:
  • Using parentheses instead of brackets
  • Omitting parameter name in brackets
  • Using expression-bodied syntax incorrectly
3.

Given the following code, what will be the output?

public record Key(int Id);

public class Store {
    private Dictionary<Key, string> data = new();
    public string this[Key key] {
        get => data.TryGetValue(key, out var val) ? val : "Not found";
        set => data[key] = value;
    }
}

var store = new Store();
store[new Key(1)] = "Apple";
store[new Key(2)] = "Banana";
Console.WriteLine(store[new Key(1)]);
Console.WriteLine(store[new Key(3)]);
medium
A. Not found\nNot found
B. Apple\nBanana
C. Compilation error
D. Apple\nNot found

Solution

  1. Step 1: Understand how the indexer accesses data

    The indexer uses a Dictionary with Key as key type. It returns the value if found, else "Not found".
  2. Step 2: Check the keys used

    Keys with Id 1 and 2 are added. Accessing new Key(1) finds "Apple". Accessing new Key(3) is missing, so returns "Not found".
  3. Final Answer:

    Apple Not found -> Option D
  4. Quick Check:

    Key(1) found, Key(3) missing = Apple, Not found [OK]
Hint: Indexer uses dictionary lookup; missing keys return default [OK]
Common Mistakes:
  • Assuming new Key(1) is different from stored Key(1)
  • Expecting Banana for Key(3)
  • Ignoring TryGetValue fallback
4.

Identify the error in the following code snippet that implements an indexer with a custom type Key:

public class DataStore {
    private Dictionary<Key, int> dict = new();
    public int this[Key key] {
        get { return dict[key]; }
        set { dict.Add(key, value); }
    }
}
medium
A. Using dict.Add in set causes exception if key exists; should use dict[key] = value.
B. Indexer must return string, not int.
C. Key type cannot be used as indexer parameter.
D. Missing constructor for DataStore class.

Solution

  1. Step 1: Analyze the set accessor

    The set accessor uses dict.Add(key, value), which throws an exception if the key already exists.
  2. Step 2: Suggest correct usage

    To update or add, use dict[key] = value; which overwrites existing or adds new key.
  3. Final Answer:

    Using dict.Add in set causes exception if key exists; should use dict[key] = value. -> Option A
  4. Quick Check:

    dict.Add throws if key exists; use dict[key] = value [OK]
Hint: Use dict[key] = value to avoid exceptions on set [OK]
Common Mistakes:
  • Using Add instead of index assignment in set
  • Thinking Key cannot be indexer parameter
  • Confusing return types in indexer
5.

You want to create a class Matrix that uses a custom struct Position as the indexer key to store integer values. The Position struct has two int fields: Row and Col. Which approach correctly implements the indexer to allow getting and setting values by Position?

public struct Position {
    public int Row, Col;
    public Position(int r, int c) { Row = r; Col = c; }
}

public class Matrix {
    private Dictionary<Position, int> values = new();
    // Implement indexer here
}
hard
A. public int this[Position pos] { get => values[pos]; set => values[pos] = value; }
B. public int this[Position pos] { get => values.TryGetValue(pos, out var v) ? v : 0; set => values[pos] = value; }
C. public int this[Position pos] { get { return values[pos]; } set { values.Add(pos, value); } }
D. public int this[int row, int col] { get => values[new Position(row, col)]; set => values[new Position(row, col)] = value; }

Solution

  1. Step 1: Consider safe get behavior

    Using TryGetValue with fallback 0 avoids exceptions if the position key is missing.
  2. Step 2: Check set accessor correctness

    Using values[pos] = value; safely adds or updates the dictionary entry.
  3. Step 3: Evaluate other options

    public int this[int row, int col] { get => values[new Position(row, col)]; set => values[new Position(row, col)] = value; } uses two parameters, not matching the question's single Position key. public int this[Position pos] { get { return values[pos]; } set { values.Add(pos, value); } } uses Add in set, which throws if key exists. public int this[Position pos] { get => values[pos]; set => values[pos] = value; }'s get accessor throws if key missing.
  4. Final Answer:

    public int this[Position pos] { get => values.TryGetValue(pos, out var v) ? v : 0; set => values[pos] = value; } -> Option B
  5. Quick Check:

    Safe get with TryGetValue + index assignment set [OK]
Hint: Use TryGetValue in get to avoid exceptions on missing keys [OK]
Common Mistakes:
  • Using Add in set causing exceptions
  • Not handling missing keys in get
  • Using multiple parameters instead of custom type
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