LINQ to HogeHoge

クエリ演算子に相当する拡張メソッドを用意すれば、クエリ式の動作をユーザー定義にすることができる


以下はその例


クエリ演算子 where, select に相当する拡張メソッド Where, Select を用意する

using System;
using System.Collections.Generic;

namespace Shand.Linq
{
    public static class Enumerable
    {
        public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> pred)
        {
            foreach (T item in source)
            {
                if (pred(item))
                    yield return item;
            }
        }

        public static IEnumerable<U> Select<T, U>(this IEnumerable<T> source, Func<T, U> selector)
        {
            foreach (T item in source)
            {
                yield return selector(item);
            }
        }
    }
}


使う側では、System.Linq の代わりにユーザー定義の名前空間を using することで
クエリ式がユーザー定義の動作になる

using System;
//using System.Linq;
using Shand.Linq; // ユーザー定義Linq

namespace CsConsole3
{
    class Program
    {
        private static void Main()
        {
            var ls = new[] {
                new {Name = "Akira",  Age = 23},
                new {Name = "Johnny", Age = 38},
                new {Name = "Millia", Age = 16}
            };

            var query = from x in ls where x.Age % 2 == 0 select x.Name;

            foreach (var item in query)
            {
                Console.WriteLine(item);
            }
        }
    }
}