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

Custom LINQ extension methods in C Sharp (C#) - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Custom LINQ Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of a custom LINQ extension method

What is the output of this C# code using a custom LINQ extension method?

C Sharp (C#)
using System;
using System.Collections.Generic;
using System.Linq;

public static class Extensions
{
    public static IEnumerable<int> DoubleEvenNumbers(this IEnumerable<int> source)
    {
        foreach (var num in source)
        {
            if (num % 2 == 0)
                yield return num * 2;
        }
    }
}

class Program
{
    static void Main()
    {
        var numbers = new List<int> {1, 2, 3, 4, 5};
        var result = numbers.DoubleEvenNumbers();
        foreach (var n in result)
            Console.Write(n + " ");
    }
}
A4 8
B1 3 5
C2 4
D1 2 3 4 5
Attempts:
2 left
💡 Hint

Look at which numbers are even and how they are transformed.

🧠 Conceptual
intermediate
1:30remaining
Purpose of 'this' keyword in extension methods

In C#, what does the this keyword before the first parameter in an extension method signify?

AIt marks the method as static.
BIt indicates the method is an extension method for the type of the parameter.
CIt makes the method private.
DIt means the method can only be called inside the class.
Attempts:
2 left
💡 Hint

Think about how extension methods add functionality to existing types.

🔧 Debug
advanced
2:30remaining
Identify the error in this custom LINQ extension method

What error will this code produce when compiled?

C Sharp (C#)
public static class Extensions
{
    public static IEnumerable<int> FilterOdds(this IEnumerable<int> source)
    {
        return source.Where(x => x % 2 == 1);
    }

    public static IEnumerable<int> FilterOdds(this List<int> source)
    {
        return source.Where(x => x % 2 == 1);
    }
}
ACompile-time error: Duplicate method name with same signature
BCompile-time error: Missing return statement
CRuntime error: StackOverflowException
DNo error, compiles and runs fine
Attempts:
2 left
💡 Hint

Check method signatures and how overload resolution works for extension methods.

📝 Syntax
advanced
2:00remaining
Correct syntax for a custom LINQ extension method with multiple parameters

Which option shows the correct syntax for an extension method that filters strings by minimum length?

Apublic static IEnumerable<string> FilterByLength(IEnumerable<string> source, int minLength) { return source.Where(s => s.Length >= minLength); }
Bpublic IEnumerable<string> FilterByLength(IEnumerable<string> source, int minLength) { return source.Where(s => s.Length >= minLength); }
Cpublic static IEnumerable<string> FilterByLength(this IEnumerable<string> source, int minLength) { return source.Where(s => s.Length >= minLength); }
Dpublic static IEnumerable<string> FilterByLength(this IEnumerable<string> source) { return source.Where(s => s.Length >= minLength); }
Attempts:
2 left
💡 Hint

Remember extension methods must be static and the first parameter uses this.

🚀 Application
expert
3:00remaining
Result count after chaining custom LINQ extension methods

Given these two extension methods, what is the count of items in result?

C Sharp (C#)
using System;
using System.Collections.Generic;
using System.Linq;

public static class Extensions
{
    public static IEnumerable<int> MultiplyBy(this IEnumerable<int> source, int factor)
    {
        foreach (var n in source)
            yield return n * factor;
    }

    public static IEnumerable<int> FilterGreaterThan(this IEnumerable<int> source, int threshold)
    {
        foreach (var n in source)
            if (n > threshold)
                yield return n;
    }
}

class Program
{
    static void Main()
    {
        var numbers = new List<int> {1, 2, 3, 4, 5};
        var result = numbers.MultiplyBy(3).FilterGreaterThan(10);
        Console.WriteLine(result.Count());
    }
}
A2
B0
C3
D1
Attempts:
2 left
💡 Hint

Multiply each number by 3, then count how many are greater than 10.

Practice

(1/5)
1. What is a key requirement for creating a custom LINQ extension method in C#?
easy
A. It must be a static method inside a static class with this on the first parameter.
B. It must be an instance method inside any class.
C. It must return void and take no parameters.
D. It must be declared inside the Main method.

Solution

  1. Step 1: Understand extension method structure

    Extension methods must be static methods inside static classes.
  2. Step 2: Identify the special parameter usage

    The first parameter must have the this keyword to specify the type it extends.
  3. Final Answer:

    It must be a static method inside a static class with this on the first parameter. -> Option A
  4. Quick Check:

    Extension method = static + static class + this param [OK]
Hint: Remember: static method + static class + this param [OK]
Common Mistakes:
  • Making the method non-static
  • Forgetting the static class container
  • Omitting the 'this' keyword on the first parameter
2. Which of the following is the correct syntax to declare a custom LINQ extension method named IsEven for IEnumerable<int>?
easy
A. public static bool IsEven(this IEnumerable<int> source) { ... }
B. public bool IsEven(IEnumerable<int> source) { ... }
C. static bool IsEven(IEnumerable<int> source) { ... }
D. public static bool IsEven(IEnumerable<int> source) { ... }

Solution

  1. Step 1: Check method modifiers and parameters

    The method must be public static and have this before the first parameter to be an extension method.
  2. Step 2: Verify the parameter type and method signature

    public static bool IsEven(this IEnumerable<int> source) { ... } correctly uses this IEnumerable<int> source and is static and public.
  3. Final Answer:

    public static bool IsEven(this IEnumerable<int> source) { ... } -> Option A
  4. Quick Check:

    Extension method syntax = public static + this param [OK]
Hint: Look for 'public static' and 'this' on first parameter [OK]
Common Mistakes:
  • Missing 'this' keyword on the first parameter
  • Not making the method static
  • Incorrect access modifier
3. Given this custom LINQ extension method, what will be the output?
public static IEnumerable<int> GetPositive(this IEnumerable<int> source) {
    foreach (var num in source) {
        if (num > 0) yield return num;
    }
}

var numbers = new List<int> { -1, 0, 3, 5, -2 };
var result = numbers.GetPositive().ToList();
Console.WriteLine(string.Join(",", result));
medium
A. -1,0,3,5,-2
B. 0,3,5
C. 3,5,-2
D. 3,5

Solution

  1. Step 1: Understand the extension method logic

    The method yields only numbers greater than zero from the source list.
  2. Step 2: Apply the method to the list

    From the list [-1, 0, 3, 5, -2], only 3 and 5 are greater than zero and yielded.
  3. Final Answer:

    3,5 -> Option D
  4. Quick Check:

    Filter positive numbers = 3,5 [OK]
Hint: Focus on the 'if (num > 0)' filter condition [OK]
Common Mistakes:
  • Including zero as positive
  • Returning all numbers without filtering
  • Confusing yield return with return
4. Identify the error in this custom LINQ extension method:
public static IEnumerable<int> FilterEven(IEnumerable<int> source) {
    foreach (var num in source) {
        if (num % 2 == 0) yield return num;
    }
}
medium
A. Cannot use 'yield return' inside a foreach loop.
B. Method should return void instead of IEnumerable<int>.
C. Missing 'this' keyword on the first parameter to make it an extension method.
D. The modulo operator '%' is not valid in C#.

Solution

  1. Step 1: Check extension method signature

    The method lacks the this keyword on the first parameter, so it is not an extension method.
  2. Step 2: Verify other syntax elements

    Using yield return inside a foreach is valid, and '%' is a valid operator in C#.
  3. Final Answer:

    Missing 'this' keyword on the first parameter to make it an extension method. -> Option C
  4. Quick Check:

    Extension method requires 'this' on first parameter [OK]
Hint: Extension methods always need 'this' on first parameter [OK]
Common Mistakes:
  • Forgetting 'this' keyword
  • Thinking 'yield return' is invalid in loops
  • Misunderstanding the modulo operator
5. You want to create a custom LINQ extension method ToDictionaryByLength that converts an IEnumerable<string> into a Dictionary<int, List<string>>, grouping strings by their length. Which implementation correctly achieves this?
hard
A. public static Dictionary ToDictionaryByLength(IEnumerable<string> source) { return source.ToDictionary(s => s.Length, s => new List<string> { s }); }
B. public static Dictionary ToDictionaryByLength(this IEnumerable<string> source) { return source.GroupBy(s => s.Length) .ToDictionary(g => g.Key, g => g.ToList()); }
C. public static Dictionary ToDictionaryByLength(this IEnumerable<string> source) { var dict = new Dictionary(); foreach (var s in source) { dict[s.Length] = new List<string> { s }; } return dict; }
D. public static Dictionary ToDictionaryByLength(this IEnumerable<string> source) { return source.ToDictionary(s => s.Length, s => s); }

Solution

  1. Step 1: Understand grouping by length

    We need to group strings by their length, so GroupBy with key s.Length is correct.
  2. Step 2: Convert groups to dictionary

    Use ToDictionary with group key and list of strings as value.
  3. Step 3: Check other options

    public static Dictionary ToDictionaryByLength(IEnumerable<string> source) { return source.ToDictionary(s => s.Length, s => new List<string> { s }); } does not group; it tries to create dictionary with duplicate keys causing error. public static Dictionary ToDictionaryByLength(this IEnumerable<string> source) { var dict = new Dictionary(); foreach (var s in source) { dict[s.Length] = new List<string> { s }; } return dict; } overwrites values instead of adding to list. public static Dictionary ToDictionaryByLength(this IEnumerable<string> source) { return source.ToDictionary(s => s.Length, s => s); } tries to map to string instead of list.
  4. Final Answer:

    public static Dictionary<int, List<string>> ToDictionaryByLength(this IEnumerable<string> source) { return source.GroupBy(s => s.Length) .ToDictionary(g => g.Key, g => g.ToList()); } -> Option B
  5. Quick Check:

    GroupBy + ToDictionary with list = correct grouping [OK]
Hint: Use GroupBy then ToDictionary with list conversion [OK]
Common Mistakes:
  • Not grouping before ToDictionary
  • Overwriting dictionary entries instead of adding to list
  • Returning wrong value types in dictionary
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