转自: http://www.cnblogs.com/OceanEyes/archive/2012/08/27/linq-2.html
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 委托Test { delegate bool FilterDelegate(int i); class Program { static void Main(string[] args) { int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 }; List<int> newList = MyFilter(array,FilterOdd); foreach (int item in newList) { Console.WriteLine(item); } Console.ReadKey(); } static List<int> MyFilter(int[] array, FilterDelegate filter) { List<int> list = new List<int>(); for (int i = 0; i < array.Length; i++) { if (filter(i)) { list.Add(i); } } return list; } /// <summary> /// 偶数 /// </summary> /// <param name="i"></param> /// <returns></returns> static bool FilterEven(int i) { return i % 2 == 0; } /// <summary> /// 奇数 /// </summary> /// <param name="i"></param> /// <returns></returns> static bool FilterOdd(int i) { return i % 2 == 1; } } }
//例如 delegate void Del(int x); .... Del d = delegate(int k) { /* ... */ };
所以上面例子小小改动一下即可:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 委托Test { delegate bool FilterDelegate(int i); class Program { static void Main(string[] args) { int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 }; //使用匿名方法来求偶数 List<int> newList = MyFilter(array, delegate(int i) { return i % 2 == 0; }); foreach (int item in newList) { Console.WriteLine(item); } Console.ReadKey(); } static List<int> MyFilter(int[] array, FilterDelegate filter) { List<int> list = new List<int>(); for (int i = 0; i < array.Length; i++) { if (filter(i)) { list.Add(i); } } return list; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 委托Test { delegate bool FilterDelegate(int i); class Program { static void Main(string[] args) { int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 }; //使用Lambda表达式来求偶数 List<int> newList = MyFilter(array, i => i % 2==0); foreach (int item in newList) { Console.WriteLine(item); } Console.ReadKey(); } static List<int> MyFilter(int[] array, FilterDelegate filter) { List<int> list = new List<int>(); for (int i = 0; i < array.Length; i++) { if (filter(i)) { list.Add(i); } } return list; } } }
(请注意,我标注出来的Fun<T,TResult>是一个委托!)
所以再对上面的Filter进行改进:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 委托Test { //delegate bool FilterDelegate(int i); class Program { static void Main(string[] args) { int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 }; //使用匿名方法来求偶数 //List<int> newList = MyFilter(array, delegate(int i) { // return i % 2 == 0; //}); //使用Lambda表达式求偶数 List<int> newList = MyFilter(array, i => i % 2 == 0); foreach (int item in newList) { Console.WriteLine(item); } Console.ReadKey(); } //Func<int,bool>: 封装了一个具有一个int参数并且返回类型为bool类型的方法 static List<int> MyFilter(int[] array,Func<int,bool> filter) { List<int> list = new List<int>(); for (int i = 0; i < array.Length; i++) { if (filter(i)) { list.Add(i); } } return list; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LambdaDemo { class Program { static void Main(string[] args) { string[] names = {"Eyes","Voodoo","Tod","Chris","Christina","Maxisim" }; Func<string, bool> filter = s => s.Length > 5; Func<string, string> order = s => s; Func<string, string> operating = s => s.ToUpper(); IEnumerable<string> expr = names.Where(filter).OrderByDescending(order).Select(operating); expr.ToList<string>().ForEach(i => Console.WriteLine(i)); Console.ReadKey(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; namespace Lambda表达式树 { class Program { static void Main(string[] args) { //计算(Price-5)*Count*Rebate ParameterExpression paraPrice = Expression.Parameter(typeof(decimal),"price"); ConstantExpression constant = Expression.Constant(5m,typeof(decimal)); BinaryExpression result1 = Expression.Subtract(paraPrice, constant); ParameterExpression paraCount = Expression.Parameter(typeof(decimal),"count"); ParameterExpression paraRebate = Expression.Parameter(typeof(decimal),"rebate"); BinaryExpression result2 = Expression.Multiply(paraCount,paraRebate); BinaryExpression result3 = Expression.Multiply(result1,result2); Expression<Func<decimal, decimal, decimal, decimal>> totalPrice = Expression.Lambda<Func<decimal, decimal, decimal, decimal>>(result3,paraPrice,paraCount,paraRebate); Func<decimal, decimal, decimal, decimal> myFun = totalPrice.Compile(); Console.WriteLine(myFun(125m,10m,0.5m)); Console.ReadKey(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Expression<Func<int, int>> f1 = x => x + 1; //f1(1)//...错误,必须将表达式树表示的代码编译成一个可执行委托 Func<int, int> f2 = f1.Compile(); Console.WriteLine(f2(2)); Console.ReadKey(); } } }