C#のLINQの自作サンプル

こちらはC#のLINQの内部構造の小さな拡張メソッドのサンプルです。以下のコードは、整数のリストから偶数だけを取り出すための拡張メソッド「EvenNumbers」を定義した例です。

using LinqExtensions;

class Program
{
    static void Main(string[] args)
    {
        var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        var evenNumbers = numbers.EvenNumbers();

        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}

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

この拡張メソッドは、「IEnumerable<int>」という型に対して定義されています。拡張メソッドは、第一引数に「this」キーワードを付けた引数を持ち、その引数を拡張するためのメソッドとなります。つまり、「IEnumerable<int>」型の変数に対して「EvenNumbers」というメソッドが呼び出された場合、この拡張メソッドが呼び出されることになります。

この拡張メソッドは、foreach文で「source」という引数に渡されたリストの中身を1つずつ取り出し、その要素が偶数である場合にだけ「yield return」キーワードを使って値を返しています。このように「yield return」キーワードを使うことで、呼び出し元に値を返すことができます。

このようにLINQの内部構造に詳しくなることで、自分で拡張メソッドを作成することができます。