C#利用delegate实现Javascript的each方法
C#中有很多易混淆的关键词,例如delegate,Func,Action和Predicate。Func,Action和Predicate本质上都是delegate,下面看一下delegate概念。
1delegate概念
delegate本质上就是一个指向函数的指针,可以指向不同的函数,只要函数的签名和代理一致即可。
2delegate应用
其实Func,Action,Predicate等都是delegate,只是特殊的delegate而已。delegate的巧妙应用,可以大大简化代码和提高灵活性。下面有一段Javascript代码,JS中经常使用数组的each方法来遍历数组并对其进行处理,如下所示:
vararr=["one","two","three","four"]; $.each(arr,function(){ alert(this); }); //上面这个each输出的结果分别为:one,two,three,four
那么在C#中如何通过delegate来定义一个数组each方法呢,可以通过传入方法来实现灵活的逻辑处理,静态ListEx类下有一个静态的Each方法,定义如下:
publicstaticT[]Each<T>(T[]source,Func<T,T>function) { T[]ret=newT[source.Length]; inti=0; foreach(Titeminsource) { ret[i]=function(item); i++; } returnret; }
那么我们可以定义一个字符串数组,并定义一个delegate作为函数参数进行传入,调用ListEx.Each方法:
vararr=newstring[]{"one","two","three","four"}; varnewArr=ListEx.Each<string>(arr,delegate(stringx){ x=x+"_do"; returnx; });
当然可以用表达式进行简化:
varnewArr2=ListEx.Each<string>(newArr,(stringx)=>x=x+"_do");
我们也可以定义一个Where方法来过滤数组:
publicstaticIList<T>Find<T>(IList<T>source,Predicate<T>predicate) { List<T>ret=newList<T>(); foreach(Titeminsource) { if(predicate(item)) { ret.Add(item); } } returnret; } publicstaticT[]Where<T>(T[]source,Predicate<T>predicate) { IList<T>list=source.ToList<T>(); IList<T>retList=Find<T>(list,predicate); returnretList.ToArray<T>(); }
调用如下:
varnewArr3=ListEx.Where<string>(arr,x=>x=="two");
3区别概述
- Func是必须指定返回值的代理;
- Action为返回值为void的代理;
- Predicate为返回值为bool的代理;
以上就是本文的详细内容,希望对大家的学习C#程序设计有所帮助。