クエリ演算子に相当する拡張メソッドを用意すれば、クエリ式の動作をユーザー定義にすることができる
以下はその例
クエリ演算子 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); } } } }