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#程序设计有所帮助。