C#利用delegate实现Javascript的each方法

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

(0)

相关推荐

  • C#委托delegate实例解析

    所谓c#的委托就是说把函数当参数来传递. 这个在js完全就用不着搞什么委托东西,直接转就是了.而对于C#来说则不是这样! 一个函数,如果它的参数是函数,那么是这样子写的 : public void method(Action<string, Int32> voidMethod, Func<string, Int32> returnMethod) Action<string, Int32> voidMethod 意思是说这个将被传进来的函数是一个没有return的函数,就

  • C#使用委托(delegate)实现在两个form之间传递数据的方法

    本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法.分享给大家供大家参考.具体分析如下: 关于Delegate[代理.委托]是C#中一个非常重要的概念,向前可以推演到C++的指针,向后可以延续到匿名方法.lambda表达式. 现在我就从一个最简单最实用的一个小例子出发分析一下Delegate的使用. 现在有两个窗体Form1和Form2. 两个按钮Button1(Form)和Button2(Form2). Form1的代码: private void button

  • C# 委托(delegate) 的小例子

    代码如下: 复制代码 代码如下: static void Main(string[] args)        {           Console.WriteLine(Exec(GetSet));           Console.ReadKey();        }        //定义委托,用于将方法做为参数传给Exec.        public delegate string GetResultDelegate();        public static string G

  • C#事件处理和委托event delegate实例简述

    本文实例讲述了C#事件处理和委托event delegate,分享给大家供大家参考.具体方法如下: 以下仅仅是用最简单的方式表示事件,实际应用可能是不同窗体之间相互通知某些操作,达到触发. 首先声明一个degate的 EventHandler 参数可以没有 一个或多个 但是触发和使用一定要匹配. 创建一个该EvenHandler的实例a 在程序建立或你需要的时候产生一个事件触发申明: a += new EventHandler(d); public delegate void EventHand

  • C# interface与delegate效能比较的深入解析

    前言以前在Code Complete 2nd(代码大全2)这本书上看过说在像是C#这种类型语言中能不要用delegate就尽量不要用,多使用interface取代,以避免效能上的影响实践出真理,所以我就写了个小范例来测试我的硬件是2.66G 4核心CPU,内存4G 我不知道是不是电脑比较快,以及我写的函数太小的关系次数到了10000000次才看到有影响 到了100000000次后看起来也是还好总而分析,还是会有影响需要高效运算或是在嵌入式中,应该还是要多注意一点代码 复制代码 代码如下: usi

  • C#匿名方法与Delegate类型转换错误分析

    本文实例分析了C#匿名方法与Delegate类型转换错误.分享给大家供大家参考.具体分析如下: 问题描述 C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法: 复制代码 代码如下: public object Invoke(Delegate method); public IAsyncRe

  • C#利用delegate实现Javascript的each方法

    C#中有很多易混淆的关键词,例如delegate,Func, Action和 Predicate.Func, Action和 Predicate本质上都是delegate,下面看一下delegate概念. 1 delegate概念 delegate本质上就是一个指向函数的指针,可以指向不同的函数,只要函数的签名和代理一致即可. 2 delegate应用 其实Func, Action, Predicate等都是delegate,只是特殊的delegate而已.delegate的巧妙应用,可以大大简

  • 利用CSS、JavaScript及Ajax实现图片预加载的三大方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增强网站的性能与可用性. 方法一:用CSS和JavaScript实现预加载 实现预加载图片有很多方法,包括使用CSS.JavaScript及两者的各种组合.这些技术可根据不同设计场景设计出相应的解决方案,十分高效.

  • 利用CSS、JavaScript及Ajax实现图片预加载的方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增强网站的性能与可用性. 实现图片预加载可以使用css.JavaScript.Ajax三种方法.下面分别介绍这些方法的实现. 使用CSS 单纯的使用css可以将图片加载到页面元素的背景上,这种方法简单.高效: #d

  • IOS 中UIKit-UIPageControl利用delegate定位圆点位置

    IOS 中UIKit-UIPageControl利用delegate定位圆点位置 在UIScrollView中会添加UIPageControl作为页码标识,可以让用户清楚的知道当前的页数.我们需要优化的一点是让pageControl的小圆点精确的跟着scrollView而定位.我们先来看一下效果图: 我们发现,当图片拖动不到一半的时候,pageControl的圆点定位到前一张图,图片拖动超过一半的时候,定位到下一张图.这里就需要四舍五入的计算了. 我们可以利用协议 delegate 去做这件事情

  • javascript跨域方法、原理以及出现问题解决方法(详解)

    javascript跨域访问是web开发者经常遇到的问题,什么是跨域,一个域上加载的脚本获取或操作另一个域上的文档属性,下面将列出三种实现javascript跨域方法: 1.基于iframe实现跨域 基于iframe实现的跨域要求两个域具有aa.xx.com,bb.xx.com这种特点,也就是两个页面必须属于一个基础域(例如都是xxx.com,或是xxx.com.cn),使用同一协议(例如都是 http)和同一端口(例如都是80),这样在两个页面中同时添加document.domain,就可以实

  • 如何利用JSHint减少JavaScript的错误

    前言 JSHint用于分析和验证JavaScript代码是否符合您的编码规则.这个强大的工具可以帮助发现您代码中错误和问题T,它强制你的团队保持一定的编码惯例和风格,使得代码可靠和更容易阅读. 在这篇文章中,我将向您展示如何安装.配置和使用JSHint. 还包括一个例子,列出了一些我最喜欢的能使用JSHint的编辑器. 安装 JSHint 安装JSHint非常容易,你可以使用 Node 包管理器 (npm)来做.如果你还没有安装npm,你可以从 nodeJS website下载最新版,来安装No

  • 利用CSS、JavaScript及Ajax实现高效的图片预加载

    方法一:用CSS和JavaScript实现预加载 实现预加载图片有很多方法,包括使用CSS.JavaScript及两者的各种组合.这些技术可根据不同设计场景设计出相应的解决方案,十分高效. 单纯使用CSS,可容易.高效地预加载图片,代码如下: 复制代码 代码如下: #preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; } #preload-02 { background:

  • jQuery实现动态加载(按需加载)javascript文件的方法分析

    本文实例讲述了jQuery实现动态加载(按需加载)javascript文件的方法.分享给大家供大家参考,具体如下: 为了提高网页程序的性能,在很多情况下javascript 是按需加载,而不是全部写在 <head>里面.利用jQuery可以很方便的实现按需加载js. $("#load").click(function(){ $.getScript('helloworld.js', function() { $("#content").html('js 加

  • javascript数组去重方法总结(推荐)

     第一种--对象键值去重 Array.prototype.unique1 = function () { var r = {}, temp = [] for (var i = 0; i < this.length; i++) { if (!r[this[i]]) { r[this[i]] = 1 temp.push(this[i]) } } return temp } 第二种--splice删除去重 Array.prototype.unique2 = function () { for (var

  • 利用原生的JavaScript实现简单拼图游戏

    前言 本篇主要讲解,如何利用原生的 JavaScript 来实现一个简单的拼图小游戏. 一.游戏的基础逻辑 想用一门语言来开发游戏,必须先了解如何使用这门语言来实现一些基础逻辑,比如图像的绘制.交互的处理.定时器等. 1.图形绘制 图形绘制是一切的基础,这里使用 JavaScript 在 canvas 上进行绘制.即先在 html 中创建 canvas 元素,然后在 JavaScript 中,通过 id 拿到这个元素,并且通过 canvas 拿到对应的上下文环境 context ,为后续的绘图做

随机推荐