在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天高手讨论了一个问题:
FuncList.FindAll(pNodes => pNodes.ParentID == "01") 等价于 if(pNodes.ParentID == "01") return pNodes; 实际就是一个委托函数的缩写。 总结一下:
“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。 所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”。
http://baike.baidu.com/view/3048187.htm
Windbey中为了增强对集合的访问能力, MS设计了List<T>这么一个泛型集合, 其中有不少的增强功能,比如Foreach,ConvertAll,FindAll等等,并且为了方便使用MS在System名空间下引入了一些特制的Delegate.主要包括以下几个:
20 public delegate void Action<T>(T obj); //Used by ForEach
21 public delegate int Comparison<T>(T x, T y); //Used by Sort 22 public delegate TOutput Converter<TInput, TOutput>(TInput input); //Used by ConvertAll 23 public delegate bool Predicate<T>(T obj); //Used by FindAll
同样它也引入了一些特制的Delegate: 20 public delegate T Func<T>(); 21 public delegate T Func<A0, T>(A0 arg0); 22 public delegate T Func<A0, A1, T>(A0 arg0, A1 arg1); 23 public delegate T Func<A0, A1, A2, T>(A0 arg0, A1 arg1, A2 arg2); 24 public delegate T Func<A0, A1, A2, A3, T>(A0 arg0, A1 arg1, A2 arg2, A3 arg3);
20 public delegate int Comparison<T>(T x, T y);
21 public delegate int Func<T,T,int>(T arg0, T arg1); 22 public delegate TOutput Converter<TInput, TOutput>(TInput input); 24 public delegate bool Predicate<T>(T obj); 25 public delegate bool Func<T,bool>(T arg0);
20 List<int> list=new List<int>(); 21 var numbers = new []{ 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 22 list.AddRange(numbers); 23 list.Sort(delegate (int a, int b) 24 { 25 return a.CompareTo(b); 26 } 27 ); 28 //use lambda 29 list.Sort((a,b)=>a.CompareTo(b));
20 List<int> doubleList =list.ConvertAll<int>(delegate (int i) 21 { 22 return i*2; 23 }); 24 //use lambda 25 var doubleList2=list.ConvertAll<int>(i=>i*2);
20 List<int> lowerThanFiveList =list.FindAll(delegate (int i) 21 { 22 return i<5; 23 } 24 ); 25 var lowerThanFiveList2=list.FindAll(i=>i<5);
以上是将lambda表达式运用于2.0当中. 但是在熟悉了3.0后, 你会发现2.0中的List<T>提供的增强方法完全是多余的了. 其实这些增强方法往往并不限于List<T>, 通常对于IEnumerable<T>对象都是适用的. 但是如果去改动IEnumable<T>接口那么影响实在太大了,将涉及很多的类. 所以MS仅仅在List<T>中提供了这些增强方法. 不过通过List<T>的一个构造函数,你可以使得所有的IEnumerable<T>对象可以方便的转化为List<T>,然后再利用这些方法. 21 var numbers = new []{ 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 22 var lowerThanFive=numbers.Where(i=>i<5); //never need List<T>, just operate on T[] or any other types implement IEnumerable<T> 23 foreach (var v in lowerThanFive) 24 Console.WriteLine(v);
21 var doubleList3=numbers.Select(i=>i*2); 22 foreach (var v in doubleList3) 23 Console.WriteLine(v);
21 var orderList =numbers.OrderBy(i=>i); 22 foreach (var v in orderList) 23 Console.WriteLine(v); 甚至还有很多更强大的功能: 21 var big5 =numbers.OrderByDescending(i=>i).Take(5); 22 foreach (var v in big5) 23 Console.WriteLine(v);
21 var lowerThanFive=numbers.Where<int>(i=>i<5); 22 var lowerThanFive=numbers.Where(i=>i<5); 以上两种写法竟然都没问题, 显然在下一种写法中变量i 无法获得智能感知的能力.
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论