VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • c#3.0入门第一章 Lambda表达式第五节Lambda表达式的使用范例&Lambda表达式的各种变

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  Lambda表达式的使用范例

  到现在为止的例子大多数,完全都是从文法上到功能上的说明,多数情况下不必使用Lambda表达式也能够写出来。最后,我还是来展示几个有一定实用性的Lambda表达式的实例。

  这里是一个,输入整形的数组,以其值为除数,执行除法运算后输出结果的程序。因为要执行除法运算,所以输入的值可能存在不能接受的值(0)的情况(就是说,这个示例代码可以在输入值不正确的情况下也能正常工作)。

  那么,这个程序的输入如果是0的情况下,就提示信息然后必须退出。这个意图如果用Lambda表达式该怎么写呢?

  这个问题的要点有两个。

  l  在执行计算的循环中检查0值的话,计算开始后会发生中断。就是说,可能会同时计算值与错误信息两者都输出。

  l  如果不输出计算值只输出错误信息的话,最好在计算的循环之前在设置一个检查0值的循环。但是,这样写的话就用了两个循环太冗长了。

  总之,两个方法都有缺点。换做笔者,如果有“计算开始前应该先检查完毕”的要求,去除繁冗更重要,所以更愿意选择在循环内判定。

 1using System;
 2
 3class Program
 4{
 5  static void Main(string[] args)
 6  {
 7    int[] a = { 1, 2, 0 };
 8
 9    foreach (int n in a)
10    {
11      if ( n == 0 )
12      {
13        Console.WriteLine("数组里面含有0。");
14        return;
15      }
16      Console.WriteLine(100 / n);
17    }
18    // 输出:
19    // 100
20    // 50
21    // 数组里面含有0。
22  }
23}
24
25

编缉推荐阅读以下文章

  • [C# 3.0 入门] [第一章 Lambda表达式] 第四节:Lambda的用途 & 类型声明能够和不能够省略的情况
  • [C# 3.0 入门] [第一章 Lambda表达式] 第三节:Lambda与匿名方法的区别
  • [C# 3.0 入门] [第一章 Lambda表达式] 第二节:Lambda表达式带来了什么
  • [C# 3.0 入门] [第一章 Lambda表达式] 第一节:C# 3.0 是什么 & C# 3.0的适用范围
  • C# 3.0 入门系列(一)
 

  List18 循环内判定的情况

  然而,如果使用Lambda表达式,就会有一种完全不同的答案。要判断所有数组的元素是否都满足一定的条件,只需用一个调用一个方法的Lambda表达式,事情就有着落了。在不损失可读性的范围内,把Lambda表达式写进if语句的条件中就能轻松的实现了。

  实际写出来的例子如下。Any方法是,集合的元素中只要含有一个满足参数的Lambda表达式的元素就返回true。这个用到了.NET Framework的扩展方法,为了能够使用,要在代码前面加上“using System.Linq;”。

 1using System;
 2using System.Linq; // 为了使用Any方法
 3
 4class Program
 5{
 6  static void Main(string[] args)
 7  {
 8    int[] a = { 1, 2, 0 };
 9
10    if (a.Any(x => x == 0))
11    {
12      Console.WriteLine("数组中含有0");
13      return;
14    }
15    foreach (int n in a) Console.WriteLine(100 / n);
16  }
17  // 输出:数组中含有0。
18}
19

  List19 使用Lambda表达式在计算之前就检验0值

  如果是不能使用.Net Framework 3.5的场合,List19的if语句就要写成下面的形式(稍稍有些冗长),这样在.NET Framework 2.0下也同样能够使用。

  if (Array.FindIndex(a, x => x == 0) >= 0)

  这个例子,用Lambda表达式对集合数据的处理,感觉就像对单个值进行判断的“if ( n == 0 )”一样,对集合使用“if (a.Any(x => x == 0))”就能够处理。

  总之吧,使用循环的方法对集合元素进行判断处理的方法,用仅仅一句if就能给替换了。如果经常使用这种技术,代码的结构也会更明快简洁。

编缉推荐阅读以下文章

  • [C# 3.0 入门] [第一章 Lambda表达式] 第四节:Lambda的用途 & 类型声明能够和不能够省略的情况
  • [C# 3.0 入门] [第一章 Lambda表达式] 第三节:Lambda与匿名方法的区别
  • [C# 3.0 入门] [第一章 Lambda表达式] 第二节:Lambda表达式带来了什么
  • [C# 3.0 入门] [第一章 Lambda表达式] 第一节:C# 3.0 是什么 & C# 3.0的适用范围
  • C# 3.0 入门系列(一)
 

  【短评】“=>”是不等号?

  BASIC系的语言中,不等号的写法,“=”与“>”的顺序没有明确的规定。这样的语言中,“>=”“=>”是等价的。正因为如此,熟悉了这样的语言的话“=>运算符”就很容易会被误认为是不等号。

  例如如果有下面的Lambda表达式,如果是有上述语言的使用经验的人看来,很容易就认为是不等号了。

  x => 0

  但是,使用Visual Basic的IDE的程序员,几乎就不会看见作为不等号的“=>”。因为在IDE中输入“=>”时,当场就会被自动替换为“>=”(Visual Basic 6.0与Visual Studio 2008会要求确认)

  所以综合起来考虑,如果是使用会把“=>”与不等号搞混的编程语言,那最好就要养成良好的编程习惯。

  Lambda表达式的各种变体

  Lambda表达式有各种变体。特别是在参数只有一个的情况下,因为在语法上可以省略参数两边的括弧,全面把握起来会比较困难。所以,下面的代码给出几种主流的变体的写法。

 1using System;
 2
 3delegate int NoArg();
 4delegate int OneArg(int onlyOne);
 5delegate int TowArgs(int first, int second);
 6delegate void NoRetVal();
 7
 8class Program
 9{
10  static void Main(string[] args)
11  {
12   NoArg    sample1 = () => 0;
13   OneArg   sample2 = (x) => x * 2;
14   OneArg   sample3 = (int x) => x * 2;
15   OneArg   sample4 = x => x * 2;
16   TowArgs  sample5 = (x, y) => x * y;
17   TowArgs  sample6 = (int x, int y) => x * y;
18   OneArg   sample7 = (x) => { return x * 2; };
19   OneArg   sample8 = (int x) => { return x * 2; };
20   NoRetVal sample9 = () => Console.WriteLine("Hello!");
21  }
22}
23

 

  List20 Lambda表达式的各种变体

  sample1 = () => 0

  在写没有参数的Lambda表达式的时候,要写上没有参数的空的括号。

  sample2 = (x) => x * 2

  有参数的情况下,用括号把参数表括上是最基本的写法。

  sample3 = (int x) => x * 2

  当然,如果能够明确指定参数的类型更好。

  sample4 = x => x * 2

  仅当参数只有一个的时候,参数两边的括弧可以省略。

  sample5 = (x, y) => x * y

  参数有多个的时候,用逗号分隔

  sample6 = (int x, int y) => x * y

  参数有多个的时候,也可以指定类型

  sample7 = (x) => { return x * 2; }

  Lambda语句的例子

  sample8 = (int x) => { return x * 2; }

  Lambda语中也可以指定类型

  sample9 = () => Console.WriteLine("Hello!")

  没有返回值的情况,写成调用void型返回值的方法的形式。

  下期预告

  介绍到这里,Lambda表达式的大部分内容已经介绍过了。仅仅运用本章的知识,就能够使代码发生很大的质的变化了。

  然而,如果说要完全理解了Lambda表达式的话,仅仅这样的话还为时尚早。

  实际上,推断被省略了的类型声明的“类型推断”的麻烦事还在后头呢。下一章,就来说说类型推断。同时,也将会讨论一下使用Lambda表达式的代理类型在类库中的使用方法。例如,本章中的例子里就用到了Action类型和Func类型。

 

编缉推荐阅读以下文章

  • [C# 3.0 入门] [第一章 Lambda表达式] 第四节:Lambda的用途 & 类型声明能够和不能够省略的情况
  • [C# 3.0 入门] [第一章 Lambda表达式] 第三节:Lambda与匿名方法的区别
  • [C# 3.0 入门] [第一章 Lambda表达式] 第二节:Lambda表达式带来了什么
  • [C# 3.0 入门] [第一章 Lambda表达式] 第一节:C# 3.0 是什么 & C# 3.0的适用范围
  • C# 3.0 入门系列(一)
 

  List18 循环内判定的情况

  然而,如果使用Lambda表达式,就会有一种完全不同的答案。要判断所有数组的元素是否都满足一定的条件,只需用一个调用一个方法的Lambda表达式,事情就有着落了。在不损失可读性的范围内,把Lambda表达式写进if语句的条件中就能轻松的实现了。

  实际写出来的例子如下。Any方法是,集合的元素中只要含有一个满足参数的Lambda表达式的元素就返回true。这个用到了.NET Framework的扩展方法,为了能够使用,要在代码前面加上“using System.Linq;”。

 1using System;
 2using System.Linq; // 为了使用Any方法
 3
 4class Program
 5{
 6  static void Main(string[] args)
 7  {
 8    int[] a = { 1, 2, 0 };
 9
10    if (a.Any(x => x == 0))
11    {
12      Console.WriteLine("数组中含有0");
13      return;
14    }
15    foreach (int n in a) Console.WriteLine(100 / n);
16  }
17  // 输出:数组中含有0。
18}
19

  List19 使用Lambda表达式在计算之前就检验0值

  如果是不能使用.Net Framework 3.5的场合,List19的if语句就要写成下面的形式(稍稍有些冗长),这样在.NET Framework 2.0下也同样能够使用。

  if (Array.FindIndex(a, x => x == 0) >= 0)

  这个例子,用Lambda表达式对集合数据的处理,感觉就像对单个值进行判断的“if ( n == 0 )”一样,对集合使用“if (a.Any(x => x == 0))”就能够处理。

  总之吧,使用循环的方法对集合元素进行判断处理的方法,用仅仅一句if就能给替换了。如果经常使用这种技术,代码的结构也会更明快简洁。


相关教程