All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
C#中MaskedTextBox控件的用法以及实例
缓存技术及在Rainbow,Portal的应用_.net资料_编程技术
asp.net2.0网站基础之编写代码
Discuz论坛2.5,升级到PHP,MySQL新版遇到的问题_php资料_编程技术
面向Visual,Basic开发人员的ASP.NET,2.0简介_.net资料_编程技术
php session 设置问题_[PHP教程]
SQL Server 2005 存储过程写报表举例_[SQL Server教程]
asp.net使用代码从文件夹里读取图片_[Asp.Net教程]
全面接触SQL语法(2)_[SQL,Server教程]
Webservice中使用Session、Application_[Asp.Net教程]
Reading number is top 10 pictures
9.3阅兵全景图1-抗战老兵和英雄连队梯队
泳装名模阿尔贝特妮写真2
战场废物1
Chinese paper-cut grilles art appreciation5
China's family planning commission forced abortions 270 million newborns for 30 years
Beauty shocked Japan Tokyo motor show model
在加油站厕所门口看到的告示
The terra-cotta warriors2
Breasts woman big set 2
西游四格漫画(六)
Download software ranking
Unix video tutorial6
asp.netWeb服务器高级编程
Such love down(擒爱记)
C#COM编程指南
网络管理员第三版
电车之狼R
Ashlynn Video5
jdk1.6 for windows
Boxer vs Yellow3
Love the forty days
delv published in(发表于) 2014/1/6 9:05:29 Edit(编辑)
C#,3.0新特性体验之Lambda表达式_[Asp.Net教程]

C#,3.0新特性体验之Lambda表达式_[Asp.Net教程]

C# 3.0新特性体验之Lambda表达式_[Asp.Net教程]

C#2.0介绍了一个新特性--匿名方法,允许开发者在线(inline)声明自己的函数代码而无须使用委托函数(delegate function)。C#3.0中提供了一个新特性--Lambda表达式,它提供了完成相同目标的更加简洁的格式。让我们在讨论Lambda表达式以前仔细研究一下匿名方法。

  匿名方法

  假设你需要创建一个按钮,当点击它的时候更新ListBox里的内容。在C#1.0和1.1里,你要这样做:


public MyForm()
{
 listBox = new ListBox(...);
 textBox = new TextBox(...);
 addButton = new Button(...);
 addButton.Click += new EventHandler(AddClick);
}

void AddClick(object sender, EventArgs e)
{
 listBox.Items.Add(textBox.Text);
}

  在C#2.0里,你需要这样做:


public MyForm()
{
 listBox = new ListBox(...);
 textBox = new TextBox(...);
 addButton = new Button(...);
 addButton.Click += delegate
 {
  listBox.Items.Add(textBox.Text);
};

  就像你看到的一样,你不必要特别的声明一个新方法来将它连接到一个事件上。你可以在C#2.0里使用匿名方法来完成同样的工作。C#3.0里介绍了一种更加简单的格式,Lambda表达式,你可以直接使用"=>"来书写你的表达式列表,后面跟上一个表达式或者语句块。

  Lambda表达式中的参数

  Lambda表达式中的参数可以是显式或者隐式类型的。在一个显式类型参数列表里,每个表达式的类型是显式指定的。在一个隐式类型参数列表里,类型是通过上下文推断出来的:


(int x) => x + 1 // 显式类型参数
(y,z) => return y * z; // 隐式类型参数

  Lambda演算实例

  下面的例子给出了两种不同的方法来打印出一个list中长度为偶数的字符串。第一种方法AnonMethod使用了匿名方法,第二种LambdaExample则是通过Lambda演算实现:


// Program.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Query;
using System.Xml.XLinq;
using System.Data.DLinq;

namespace LambdaExample
{
 public delegate bool KeyValueFilter(K key, V value);
 static class Program
 {

  static void Main(string[] args)
  {
   List list = new List();

   list.Add("AA");
   list.Add("ABC");
   list.Add("DEFG");
   list.Add("XYZ");
   Console.WriteLine("Through Anonymous method");
   AnonMethod(list);
   Console.WriteLine("Through Lambda expression");
   LambdaExample(list);

   Dictionary varClothes= new Dictionary();

   varClothes.Add("Jeans", 20);
   varClothes.Add("Shirts", 15);
   varClothes.Add("Pajamas", 9);
   varClothes.Add("Shoes", 9);
   var ClothesListShortage = varClothes.FilterBy((string name,
   int count) => name == "Shoes" && count < 10);
   // example of multiple parameters
   if(ClothesListShortage.Count > 0)
    Console.WriteLine("We are short of shoes");
   Console.ReadLine();
 }

 static void AnonMethod(List list)
 {
  List evenNumbers = list.FindAll(delegate(string i)
  { return (i.Length % 2) == 0; });
  foreach (string evenNumber in evenNumbers)
  {
   Console.WriteLine(evenNumber);
  }
 }

 static void LambdaExample(List list)
 {
  var evenNumbers = list.FindAll(i =>(i.Length % 2) == 0); // example of single parameter
  foreach(string i in evenNumbers)
  {
   Console.WriteLine(i);
  }
 }
}

public static class Extensions
{
 public static Dictionary FilterBy
(this Dictionary items, KeyValueFilter filter)
 {
  var result = new Dictionary();
  foreach(KeyValuePair element in items)
  {
   if (filter(element.Key, element.Value))
    result.Add(element.Key, element.Value);
  }
  return result;
 }
 
}
}

  如果你安装了Visual Studio 2005 and LinQ Preview,你可以使用编辑器来编译程序。如果没有的话,可以使用命令行方式:


C:\Program Files\LINQ Preview\Bin\Csc.exe
/reference:"C:\Program Files\LINQ Preview\Bin\System.Data.DLinq.dll"
/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll
/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll
/reference:"C:\Program Files\LINQ Preview\Bin\System.Query.dll"
/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll
/reference:"C:\Program Files\LINQ Preview\Bin\System.Xml.XLinq.dll"
/target:exe Program.cs

  中间语言结果显示

  双击AnonMethod函数你将看到C#编译器产生的中间语言代码:


.method private hidebysig static void AnonMethod(class
[mscorlib]System.Collections.Generic.List`1 list)
cil managed
{
 // Code size 96 (0x60)
 .maxstack 4
 .locals init ([0] class [mscorlib]System.Collections.Generic.List
 `1 evenNumbers,
 [1] string evenNumber,
 [2] valuetype [mscorlib]System.Collections.Generic.List
 `1/Enumerator CSCODE_REPLACEMENT 000,
 [3] bool CSCODE_REPLACEMENT 001)
 IL_0000: nop
 IL_0001: ldarg.0
 IL_0002: ldsfld class [mscorlib]System.Predicate
 `1 LambdaExample.Program::
 `<>9__CachedAnonymousMethodDelegate1'
 IL_0007: brtrue.s IL_001c
 IL_0009: ldnull
 IL_000a: ldftn bool LambdaExample.Program::
 `b__0'(string)
 IL_0010: newobj instance void class [mscorlib]System.Predicate
 `1::.ctor(object, native int)
 IL_0015: stsfld class [mscorlib]System.Predicate`1
 LambdaExample.Program::
 `<>9__CachedAnonymousMethodDelegate1'
 IL_001a: br.s IL_001c
 IL_001c: ldsfld class [mscorlib]System.Predicate`1
 LambdaExample.Program::'<>
 9__CachedAnonymousMethodDelegate1'
 IL_0021: callvirt instance class [mscorlib]System.Collections.
 Generic.List`1 class [mscorlib]System.
 Collections.Generic.List`1::
 FindAll(class [mscorlib]System.Predicate`1)
 IL_0026: stloc.0
 IL_0027: nop
 IL_0028: ldloc.0
 IL_0029: callvirt instance valuetype [mscorlib]System.Collections.
 Generic.List`1/Enumerator class
 [mscorlib]System.Collections.Generic.List`1
 ::GetEnumerator()
 IL_002e: stloc.2
 .try
 {
  IL_002f: br.s IL_0042
  IL_0031: ldloca.s CSCODE_REPLACEMENT 000
  IL_0033: call instance !0 valuetype [mscorlib]System.
  Collections.Generic.List`1/Enumerator
  ::get_Current()
  IL_0038: stloc.1
  IL_0039: nop
  IL_003a: ldloc.1
  IL_003b: call void [mscorlib]System.Console::
  WriteLine(string)
  IL_0040: nop
  IL_0041: nop
  IL_0042: ldloca.s CSCODE_REPLACEMENT 000
  IL_0044: call instance bool valuetype [mscorlib]System.
  Collections.Generic.List`1/Enumerator
  ::MoveNext()
  IL_0049: stloc.3
  IL_004a: ldloc.3
  IL_004b: brtrue.s IL_0031
  IL_004d: leave.s IL_005e
 } // end .try
 finally
 {
  IL_004f: ldloca.s CSCODE_REPLACEMENT 000
  IL_0051: constrained. valuetype [mscorlib]System.Collections.
  Generic.List`1/Enumerator
  IL_0057: callvirt instance void [mscorlib]System.
  IDisposable::Dispose()
  IL_005c: nop
  IL_005d: endfinally
 } // end handler
 IL_005e: nop
 IL_005f: ret
} // end of method Program::AnonMethod

  这里我们可以看到,实际上匿名方法和lambda表达式生成了相同的中间代码,并且他们的执行也是类似的。

  多参数的Lambda表达式

  Lambda表达式可以带上多个参数,比如你可以声明一个Dictionary类型:



Clothing Type
Count
Shirts
15
Jeans
12
Shoes
9
Pajamas
9

  如果你有一个匿名方法(FilterBy)来通过键和值来过滤字典,按么你可以传递多个参数给lambda表达式来调用这个匿名方法。附带的代码完成了这个FilterBy的功能:


var ClothesListShortage = clothesList.FilterBy((string name, int count)
=> name == "Shoes" && count < 10);
作者:维维编译 来源:天极开发





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.