概述

本篇博客主要解说lambda表达式,在这里将它的来龙去脉,主要是从托付,匿名函数这些方面过度讲的,当然,在讲托付和匿名函数的时候,主要是从Lambda的角度出发讲的,可能它们还具有其他的一些作用或用途,但这已不是本篇博客的重点了,好了接下来我们開始。

托付

概念

托付就是一个指针变量,一个存放一类方法的指针变量。

优点

托付给我们变成带来了什么优点呢?举个样例:BLL层里面有一个类A,一个类B,类A中有a方法,类B中有b方法,我们要想实现a方法中调用b方法,方式有两种。

一种是在a方法中直接调用b方法;还有一种是a方法直接调用托付x(看上面的托付定义),然后,在U层中,当我们使用A类的a方法时,再将B类的b方法赋值给托付x,从而达到a方法调用托付x(b方法)。

从这两种实现方式来说,另外一种方式更加的灵活,由于没有将b方法直接写死在a方法里,所以,之后的一些变动,我们不须要改动BLL层A类a方法里的代码了(假设里面的逻辑非常复杂,改动时非常危急和麻烦的),仅仅须要加入�一些类一些方法就能够了,直接在U层改动(变化必定会改动,这个无法改变,可是,怎么变动会更加简单非常重要),这样会使我们工作非常的简单。这个就是托付的一个优点。

匿名函数

匿名函数就是没有名称的函数,应用的场景就是,不须要函数重用,即:这个函数就用一次。举个样例说,U层使用A类的a方法时,直接给a方法传递一个匿名函数(a方法參数的定义时,须要使用托付),至于为什么给a方法传递一个匿名函数,由于a方法里须要调用这个匿名方法,须要用这些逻辑运算,而这些逻辑运算仅仅须要用一次,所以,传递一个匿名方法,这样就不用多此一举的再创建一个类,类里面在写上方法(刚刚的匿名方法),由于这样创建全然没有必要(就使用这么一次),假设这样创建一个多余的类的话,对于U层调用时,不方便代码的阅读,而是结构也是不易理解的。

Lambda表达式

Lambda表达式就是一个升级版的匿名函数,它的优点使代码变得阅读变得更加的easy,代码变得也更加的紧凑。使代码变得更加的紧凑是匿名函数解决的一个问题,Lambda表达式,再次基础上攻克了匿名函数的不便阅读问题。

实例

从Lambda表达式的发展历史上,我们解释了托付,匿名函数,接下了,我们就进行对应的Demo演示

托付和普通函数的比較

<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace function1
{
public class class1
{
public string GetName1() {
return "直接写死的方法";
} public string GetName2() {
return "通过托付实现";
}
}
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace function1
{
//普通托付
public delegate string MyDelegateClass();
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace function1
{
public class class3
{
public string GetName(MyDelegateClass myEnTrustFunction) {
return myEnTrustFunction();
} public string GetName() {
return new class1().GetName1();
}
}
}</span>

托付函数和托付匿名函数的比較

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace function2
{
public class class1
{
public string GetName1(MyDelegateClass myFunction) {
return myFunction();
}
}
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace function2
{
//普通托付
public delegate string MyDelegateClass();
} using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace function2
{
public class class3
{
public string GetName() {
return "托付函数";
}
}
}

托付匿名函数和托付Lambda表达式的比較

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace function3
{
//普通托付
public delegate string MyDelegateClass();
}
<span style="font-family: 宋体;">using System;</span>
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace function3
{
public class Class2
{
public string GetName(MyDelegateClass myFunction){
return myFunction();
}
}
}

client代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 学习.Lambda表达式
{
class Program
{
static void Main(string[] args)
{
#region 托付和普通函数的比較
//function1.class3 fun1 = new function1.class3();
//Console.WriteLine(fun1.GetName());
//Console.WriteLine(fun1.GetName(new function1.class1().GetName2));
#endregion #region 托付函数和托付匿名函数的比較
//function2.class1 fClass1 = new function2.class1();
//Console.WriteLine(fClass1.GetName1(new function2.class3().GetName));
//Console.WriteLine(fClass1.GetName1(delegate() { return "匿名函数"; }));
#endregion #region 托付匿名函数和托付lambda表达式的比較
function3.Class2 class2 = new function3.Class2(); Console.WriteLine(class2.GetName(delegate() { return "匿名函数"; }));
class2.GetName(() => { return "Lambda表达式"; });
#endregion Console.Read();
}
}
}

总结

托付使代码变得更加的灵活,基类代码不再是死板的,避免了改动逻辑比較复杂的代码;匿名函数攻克了为只使用一次的方法的创建的复杂性,使代码变得更加的紧凑;Lambda表达式,具有了匿名函数的长处,同一时候攻克了匿名函数不便阅读的问题。

LinQ—Lambda表达式的更多相关文章

  1. Ext.ux.grid.feature.Searching 解析查询参数,动态产生linq lambda表达式

    上篇文章中http://www.cnblogs.com/qidian10/p/3209439.html我们介绍了如何使用Grid的查询组建,而且将查询的参数传递到了后台. 那么我们后台如何介绍参数,并 ...

  2. 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join

    在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...

  3. Linq lamda表达式Single和First方法

      让我们来看看如何对一个整数数组使用 Single 操作符.这个整数数组的每个元素代表 2 的 1 到 10 次方.先创建此数组,然后使用 Single 操作符来检索满足 Linq Lambda表达 ...

  4. ASP.NET EF(LINQ/Lambda查询)

    EF(EntityFrameWork) ORM(对象关系映射框架/数据持久化框架),根据实体对象操作数据表中数据的一种面向对象的操作框架,底层也是调用ADO.NET ASP.NET MVC 项目会自动 ...

  5. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  6. Linq表达式和Lambda表达式用法对比

    什么是Linq表达式?什么是Lambda表达式?前一段时间用到这个只是,在网上也没找到比较简单明了的方法,今天就整理了一下相关知识,有空了再仔细研究研究 public Program() { List ...

  7. 关于Linq中的Lambda表达式中OrderBy的深入理解

    起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ...

  8. entity framework 新手入门篇(1.5)-lambda表达式与linq

    在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以la ...

  9. Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式

    当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...

随机推荐

  1. 如何开启php报错

    今天碰到一个很二的问题,安装了php网站之后,发现nginx一直无法解析到index.php文件,显示为空白,从后台的日志来看是500错误,但是同目录下的phpinfo.php却可以正常解析.想来应该 ...

  2. HttpClient 操作总结

    1.HttpClient4.3和之前版本设置超时(set timeout)区别: 参考:http://my.oschina.net/u/577453/blog/173724 解析:如果不设置超时的话, ...

  3. 桶排序-OC

    NSArray * b = @[@,@,@,@,@]; NSMutableArray *a = @[].mutableCopy; ; i<; i++) { a[i] = @; } for (NS ...

  4. 第二百一十九天 how can I 坚持

    今天好冷,白天在家待了一天,晚上,老贾生日,生日快乐,去海底捞吃了个火锅,没感觉呢. 今天还发现了个好游戏,纪念碑谷,挺新颖,就是难度有点大了. 好累.睡觉,明天想去爬山啊,可是该死的天气.

  5. Leveldb Advanced

    [Slice] The return value of the it->key() and it->value() is a simple structure that contains ...

  6. Codeforces 712 D. Memory and Scores (DP+滚动数组+前缀和优化)

    题目链接:http://codeforces.com/contest/712/problem/D A初始有一个分数a,B初始有一个分数b,有t轮比赛,每次比赛都可以取[-k, k]之间的数,问你最后A ...

  7. POJ 3616 Milking Time (排序+dp)

    题目链接:http://poj.org/problem?id=3616 有头牛产奶n小时(n<=1000000),但必须在m个时间段内取奶,给定每个时间段的起始时间和结束时间以及取奶质量 且两次 ...

  8. CSU1612Destroy Tunnels(强连通)

    Destroy Tunnels 原来早忘记了离散里含有这么一个叫传递闭包的东西 矩阵A的闭包B = A U A^2 U A^3 U ... 所以这里直接如果A[i][j]!= 0,建边i->j跑 ...

  9. HDU 5706 GirlCat (DFS,暴力)

    题意:给定一个n*m的矩阵,然后问你里面存在“girl”和“cat”的数量. 析:很简单么,就是普通搜索DFS,很少量.只要每一个字符对上就好,否则就结束. 代码如下: #include <cs ...

  10. WEB数据挖掘(十六)——Aperture数据抽取(9):数据源

    One of the central concepts of Aperture is the notion of a DataSource. A DataSource contains all inf ...