C#利用delegate实现Javascript的each方法
程序员文章站
2022-09-04 23:46:47
c#中有很多易混淆的关键词,例如delegate,func, action和 predicate。func, action和 predicate本质上都是delegate,...
c#中有很多易混淆的关键词,例如delegate,func, action和 predicate。func, action和 predicate本质上都是delegate,下面看一下delegate概念。
1 delegate概念
delegate本质上就是一个指向函数的指针,可以指向不同的函数,只要函数的签名和代理一致即可。
2 delegate应用
其实func, action, predicate等都是delegate,只是特殊的delegate而已。delegate的巧妙应用,可以大大简化代码和提高灵活性。下面有一段javascript代码,js中经常使用数组的each方法来遍历数组并对其进行处理,如下所示:
var arr = [ "one", "two", "three", "four"]; $.each(arr, function(){ alert(this); }); //上面这个each输出的结果分别为:one,two,three,four
那么在c#中如何通过delegate来定义一个数组each方法呢,可以通过传入方法来实现灵活的逻辑处理,静态listex类下有一个静态的each方法,定义如下:
public static t[] each<t>(t[] source, func<t, t> function) { t[] ret =new t[source.length]; int i = 0; foreach (t item in source) { ret[i]=function(item); i++; } return ret; }
那么我们可以定义一个字符串数组,并定义一个delegate作为函数参数进行传入,调用listex.each方法:
var arr =new string[]{ "one", "two", "three", "four"}; var newarr= listex.each<string>(arr,delegate(string x){ x=x+"_do"; return x; });
当然可以用表达式进行简化:
var newarr2 = listex.each<string>(newarr, (string x) => x = x + "_do");
我们也可以定义一个where方法来过滤数组:
public static ilist<t> find<t>(ilist<t> source, predicate<t> predicate) { list<t> ret = new list<t>(); foreach (t item in source) { if (predicate(item)) { ret.add(item); } } return ret; } public static t[] where<t>(t[] source, predicate<t> predicate) { ilist<t> list=source.tolist<t>(); ilist<t> retlist= find<t>(list, predicate); return retlist.toarray<t>(); }
调用如下:
var newarr3 = listex.where<string>(arr, x => x == "two");
3 区别概述
- func是必须指定返回值的代理;
- action为返回值为void的代理;
- predicate为返回值为bool的代理;
以上就是本文的详细内容,希望对大家的学习c#程序设计有所帮助。