iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何理解.NET 3.5扩展方法和Lambda表达式
  • 245
分享到

如何理解.NET 3.5扩展方法和Lambda表达式

2023-06-18 00:06:26 245人浏览 薄情痞子
摘要

如何理解.net 3.5扩展方法和Lambda表达式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。对于上文的简化需求,使用Lambda表达式和内置的.NET 3.5扩展方法便可

如何理解.net 3.5扩展方法和Lambda表达式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

对于上文的简化需求,使用Lambda表达式和内置的.NET 3.5扩展方法便可以写成这样:

static List< int> EvenSquareLambda(IEnumerable< int> source)  {      return source.Where(i => i % 2 == 0).Select(i => i * i).ToList();  }

.NET 3.5扩展方法的延迟效果

应该已经有许多朋友了解了.NET 3.5中处理集合时扩展方法具有“延迟”的效果,也就是说Where和Select中的委托(两个Lambda表达式)只有在调用ToList方法的时候才会执行。这是优点也是陷阱,在使用这些方法的时候我们还是需要了解这些方法的效果如何。不过这些方法其实都没有任何任何“取巧”之处,换句话说,它们的行为和我们正常思维的结果是一致的。如果您想得明白,能够自己写出类似的方法,或者能够“自圆其说”,十有八九也不会有什么偏差。但是如果您想不明白它们是如何构造的,还是通过实验来确定一下吧。实验的方式其实很简单,只要像我们之前验证“重复计算”陷阱那种方法就可以了,也就是观察委托的执行时机和顺序进行判断。

好,回到我们现在的问题。我们知道了“延迟”效果,我们知道了Where和Select会在ToList的时候才会进行处理。不过,它们的处理方式是什么样的,是像我们的“普通方法”那样“创建临时容器(如List< T>),并填充返回”吗?对于这点我们不多作分析,还是通过“观察委托执行的时机和顺序”来寻找答案。使用这种方式的关键,便是在委托执行时打印出一些信息。为此,我们需要这样一个Wrap方法(您自己做试验时也可以使用这个方法):

static Func< T, TResult> Wrap< T, TResult>(      Func< T, TResult> func,      string messgaeFORMat)  {      return i =>      {          var result = func(i);          Console.WriteLine(messgaeFormat, i, result);          return result;      };  }

Wrap方法的目的是将一个Func< T, TResult>委托对象进行封装,并返回一个类型相同的委托对象。每次执行封装后的委托时,都会执行我们提供的委托对象,并根据我们传递的messageFormat格式化输出。例如:

var wrapper = Wrap< int, int>(i => i + 1, "{0} + 1 = {1}");  for (var i = 0; i <  3; i++) wrapper(i);

则会输出:

0 + 1 = 1 1 + 1 = 2 2 + 1 = 3

那么,我们下面这段代码会打印出什么内容呢?

List< int> source = new List< int>();  for (var i = 0; i <  10; i++) source.Add(i);   var finalSource = source      .Where(Wrap< int, bool>(i => i % 3 == 0, "{0} can be divided by 3? {1}"))      .Select(Wrap< int, int>(i => i * i, "The square of {0} equals {1}."))      .Where(Wrap< int, bool>(i => i % 2 == 0, "The result {0} can be devided by 2? {1}"));   Console.WriteLine("===== Start =====");  foreach (var item in finalSource)  {      Console.WriteLine("===== Print {0} =====", item);  }

我们准备一个列表,其中包含0到9共十个元素,并将其进行Where…Select…Where的处理,您可以猜出经过foreach之后屏幕上的内容吗?

===== Start =====  0 can be divided by 3? True  The square of 0 equals 0.  The result 0 can be devided by 2? True  ===== Print 0 =====  1 can be divided by 3? False  2 can be divided by 3? False  3 can be divided by 3? True  The square of 3 equals 9.  The result 9 can be devided by 2? False  4 can be divided by 3? False  5 can be divided by 3? False  6 can be divided by 3? True  The square of 6 equals 36.  The result 36 can be devided by 2? True  ===== Print 36 =====  7 can be divided by 3? False  8 can be divided by 3? False  9 can be divided by 3? True  The square of 9 equals 81.  The result 81 can be devided by 2? False

列表中元素的执行顺序是这样的:
***个元素“0”经过Where…Select…Where,***被Print出来。
第二个元素“1”经过Where,中止。
第三个元素“2”经过Where,中止。
第四个元素“4”经过Where…Select…Where,中止。
……

.NET 3.5扩展方法的神奇之处

这说明了,我们使用.NET框架自带的Where或Select方法,最终的效果和上一节中的“合并循环”类似。因为,如果创建了临时容器保存元素的话,就会在***个Where中把所有元素都交由***个委托(i => i % 3 == 0)执行,然后再把过滤后的元素交给Select中的委托(i => i * i)执行。请注意,在这里“合并循环”的效果对外部是隐藏的,我们的代码似乎还是一步一步地处理集合。换句话说,我们使用“分解循环”的清晰方式,但获得了“合并循环”的高效实现。这就是.NET框架这些扩展方法的神奇之处1。

在我们进行具体的性能测试之前,我们再来想一下,这里出现了那么多IEnumerable对象实现了哪个GoF 23中的模式呢?枚举器?看到IEnumerable就说枚举器也太老生常谈了。其实这里同样用到了“装饰器”模式。每次Where或Select之后其实都是使用了一个新的IEnumerable对象来封装原有的对象,这样我们遍历新的枚举器时便会获得“装饰”后的效果。因此,以后如果有人问您“.NET框架中有哪些的装饰器模式的体现”,除了人人都知道的Stream之外,您还可以回答说“.NET 3.5中System.Linq.Enumerable类里的一些扩展方法”,多酷。

看完上述内容,你们掌握如何理解.NET 3.5扩展方法和Lambda表达式的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何理解.NET 3.5扩展方法和Lambda表达式

本文链接: https://www.lsjlt.com/news/294887.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解.NET 3.5扩展方法和Lambda表达式
    如何理解.NET 3.5扩展方法和Lambda表达式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。对于上文的简化需求,使用Lambda表达式和内置的.NET 3.5扩展方法便可...
    99+
    2023-06-18
  • .NET中lambda表达式合并问题及解决方法
    目录解决方案:完美解决事情的起因是公司一个小伙子问了我个问题 “海哥,来帮我看下这段代码怎么不行” Func<Report,bool> nameF...
    99+
    2022-11-13
    .net lambda表达式 .net lambda表达式合并
  • 如何使用.NET Lambda表达式实现委托
    本篇内容介绍了“如何使用.NET Lambda表达式实现委托”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!.NET Lambda表达式的写法...
    99+
    2023-06-18
  • 如何理解Java中的lambda表达式
    这篇文章主要介绍了如何理解Java中的lambda表达式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何理解Java中的lambda表达式文章都会有所收获,下面我们一起来看看吧。Lambda概述Lambda表...
    99+
    2023-06-30
  • 如何在C#项目中创建一个Lambda表达式和Lambda表达式树
    如何在C#项目中创建一个Lambda表达式和Lambda表达式树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。表达式Lambda  表达式位于 => 运算符右侧的 l...
    99+
    2023-06-06
  • 基于Arrays.sort()和lambda表达式如何实现
    小编给大家分享一下基于Arrays.sort()和lambda表达式如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Arrays.sort()和lambda...
    99+
    2023-06-22
  • 如何使用Linq Lambda表达式替换匿名方法
    小编给大家分享一下如何使用Linq Lambda表达式替换匿名方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Linq Lambda表达式Linq Lambda表达式是一种语言功能,在许多方面类似于匿名方法。事实上,如果...
    99+
    2023-06-17
  • C++ lambda 表达式如何定义和使用?
    c++++ lambda 表达式是匿名函数,用于内联定义函数,使用语法:[capture list](parameters) -> return_type {函数体}。它们可以捕获...
    99+
    2024-04-17
    c++
  • C#委托、时间和Lambda表达式怎么理解
    这篇文章主要介绍“C#委托、时间和Lambda表达式怎么理解”,在日常操作中,相信很多人在C#委托、时间和Lambda表达式怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#委托、时间和Lambda表...
    99+
    2023-06-17
  • lambda 表达式在 C++ 中如何处理异常?
    在 c++++ 中,使用 lambda 表达式处理异常有两种方法:使用 try-catch 块捕获异常,并在 catch 块中处理或重新抛出异常。使用 std::function 类型的...
    99+
    2024-04-17
    lambda 异常处理 c++
  • Lambda表达式的方法和构造器怎么引用
    本篇内容主要讲解“Lambda表达式的方法和构造器怎么引用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Lambda表达式的方法和构造器怎么引用”吧!方法引用和构造器引用了解了 Lambda 表...
    99+
    2023-07-05
  • C#和.NET框架正则表达式怎么理解
    本篇内容主要讲解“C#和.NET框架正则表达式怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#和.NET框架正则表达式怎么理解”吧!C#和.NET框架正则表达式正则表达式的一种最常用的...
    99+
    2023-06-17
  • C#中如何使用LINQ和Lambda表达式提高代码效率及解决方法
    C#中如何使用LINQ和Lambda表达式提高代码效率及解决方法引言:随着软件开发的不断进步和发展,代码的效率逐渐成为开发者关注的重要方面之一。C#作为一种强大的编程语言,提供了许多工具和功能来提高代码的效率。其中,LINQ和Lambda表...
    99+
    2023-10-22
    Lambda表达式 C#中的LINQ(Language Integrated Query)
  • Mybatis Plus的lambda表达式查询异常的处理方法
    今天小编给大家分享一下Mybatis Plus的lambda表达式查询异常的处理方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2023-06-26
  • 如何理解SqlServer表达式
    这篇文章将为大家详细讲解有关如何理解SqlServer 表达式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。0.1 使用范围SQL Server(2008开...
    99+
    2024-04-02
  • 如何理解.NET和Java发展前景
    这篇文章主要讲解了“如何理解.NET和Java发展前景”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解.NET和Java发展前景”吧!.NET和Java发展前景哪个好在编程语言中Jav...
    99+
    2023-06-15
  • 详解Java8如何使用Lambda表达式进行比较
    目录支持Lambda的基本排序无类型定义的基本排序使用引用静态方法进行排序Sort Extracted Comparators反向排序使用多个条件进行排序使用多个条件排序-组合使用S...
    99+
    2024-04-02
  • Python中lambda表达式的简要介绍和详细使用方法
    Python中lambda函数的简介与用法详解 在Python中,lambda函数是一种特殊的匿名函数,它可以在需要函数对象的任何地方使用。lambda函数通常用来定义一些简单的函数,它们可以只有一个表达式,并且返回结果。本文将...
    99+
    2024-02-02
    简介 用法详解
  • C++ lambda 表达式如何与标准算法库配合使用?
    c++++ lambda 表达式与标准算法库紧密协作,允许创建匿名函数,简化对数据的处理。具体用途包括:排序向量:使用 lambda 表达式对元素进行排序。查找元素:使用 lambda ...
    99+
    2024-04-17
    c++ lambda 代码可读性
  • 如何理解JavaScript正则表达式
    如何理解JavaScript正则表达式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、正则表达式创建var reg = /test/;var reg = new RegExp...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作