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 = ;
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#如何用delegate实现Javascript的each方法的更多相关文章

  1. delegate实现Javascript的each方法

    C#如何用delegate实现Javascript的each方法   C#中有很多易混淆的关键词,例如delegate,Func, Action和 Predicate.Func, Action和 Pr ...

  2. Javascript对象的方法赋值

    Javascript对象编程学习中,一直不能很好的掌握对象的属性(property)和方法(method).今天在写代码过程中,又犯了一个低级错误. <!DOCTYPE html> < ...

  3. JavaScript中reduce()方法

    原文  http://aotu.io/notes/2016/04/15/2016-04-14-js-reduce/   JavaScript中reduce()方法不完全指南 reduce() 方法接收 ...

  4. 两种动态加载JavaScript文件的方法

    两种动态加载JavaScript文件的方法 第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看 ...

  5. 用jQuery之后,之前javascript的一些方法就不能用了吗

    用jQuery之后,之前javascript的一些方法就不能用了吗? 比如$("#btn").onclick = function(){}这种用法?或者$("#btn&q ...

  6. html,JavaScript调用winfrom方法

    ---恢复内容开始--- 目的: 在动画上面添加点击事件,通过JavaScript调用winfrom方法 1.创建一个页面 using System; using System.Collections ...

  7. 在C#中模拟Javascript的setTimeout方法

    在C#中模拟Javascript的setTimeout方法 背景 每种语言都有自己的定时器(Timer),很多人熟悉Javascript中的setInterval和setTimeout,在Javasc ...

  8. JavaScript创建对象的方法

    显示在浏览器中的控制台中. <script type="text/javascript"> //这个工厂方法返回一个新的"范围对象" functio ...

  9. C# delegate event func action 匿名方法 lambda表达式

    delegate event action func 匿名方法 lambda表达式 delegate类似c++的函数指针,但是是类型安全的,可以指向多个函数, public delegate void ...

随机推荐

  1. ASP.NET中使用DataGrid控件按照条件显示GridView单元格的颜色

    问题描述: 我在做一个关于信用卡管理系统时遇到一个问题:信用卡内金额低于100元时,数字颜色显示为红色,其余显示为绿色 之前,尝试了修改成为模板列以及转换成Reapeater控件,甚至用了Jquery ...

  2. jsoup简单的爬取网页数据

    /** * Project Name:JavaTest * File Name:BankOfChinaExchangeRate.java * Package Name:com.lee.javatest ...

  3. Android属性动画之ValueAnimation

    ValueAnimation是ObjectAnimation类的父类,经过前几天的介绍,相信大家对ObjectAnimation有了 一定的认识,今天就为大家最后介绍一下ValueAnimation, ...

  4. (原创)详解KMP算法

    KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么 ...

  5. angular项目总结——angular + browserify + gulp + bower + less 架构分享

    一眨眼,快三个月没有写博客了.一直在为自己没有写博客而懊恼,忙过这段时间,好好总结一下. 新项目主要是自己一个人在写,先搭建了一个初步的架构,用了我并不熟悉的angular,这个过程中,慢慢也熟悉了a ...

  6. Quartz应用实践入门案例二(基于java工程)

    在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...

  7. Windows Azure Web Site (16) Azure Web Site HTTPS

    <Windows Azure Platform 系列文章目录> 我们在使用微软云Azure Web App的时候,会使用微软的二级域名:http://xxx.chinacloudsites ...

  8. C#--析构函数

  9. java中的hashcode()和equals()

    equals()和hashcode()都继承自object类. equals() equals()方法在object类中定义如下: public boolean equals(Object obj) ...

  10. DES加密解密

    加密后生成Base64字符串,并去除'='字符. 加密后替换掉'+',这样加密后的字符串可以作为url参数传递. using System; using System.IO; using System ...