上一篇说了from in select的本质,具体参见你所不知道的linq。本篇说下from...in... from... in... select

首先上一段代码,猜猜结果是什么?

    class Program
{
static void Main(string[] args)
{
/*var result = from s in new TestApp() { A = 2 } select s;*/
var result1 = from s in new TestApp() { A = }
from i in (s + ).ToString()
select (Convert.ToInt32(i) + s).ToString(); Console.WriteLine(result1.GetType() + " " + result1);
Console.ReadLine();
}
} public class TestApp
{
public int A { get; set; }
}

这段代码的运行结果是什么呢?

答案是,这段代码会报错,根本编译不过~~~~~~那么按照上一篇,我们对TestApp进行方法扩展呢?那扩展Select扩展方法,发现依旧编译不过。最后查linq的api,发现了一个叫SelectMany的方法。在结合SelectMany的用法我们可以猜测应该是这个扩展方法。于是我对TestApp进行了如下扩展,

public static class SelectExtension
{
public static string Select(this TestApp app, Func<int, int> selector)
{
return "hello,你是" + selector(app.A).ToString();
}
public static string SelectMany(this TestApp app, Func<int, string> fun1, Func<int, string, string> fun2)
{
var j = fun1(app.A);
return "hello,你真是" + fun2(app.A, j);
}
}

编译,运行,结果如下:

那么最后我们需要猜测SelectMany的通用方法是什么,也就是SelectMany到底是怎么定义的呢?

public static T SelectMany<T1,T2,T3,T>(this TestApp app, Func<T1, T2> fun1, Func<T1, T2, T3> fun2){}

其对应的from...in... from... in...select 语句如下

  from t1 in TestApp

  from t2 in fun1(t1)

  select fun2(t1,t2)

  • 对于需要扩展的类型也就是TestApp,位于第一个in后面
  • t1,类型为T1的,它是fun1和func2的参数,具体t1是什么,需要看SelectMany里面如何实现
  • t2,类型是T2的,它是通过fun1执行出来的,并且作为fun2的参数,不t2可能与t1没有直接关系,这个看fun1如何定义
  • 需要注意的是select后面的对象只是fun2的返回值,不是from...in... from... in...select语句的返回值,该语句的返回值是SelectMany扩展方法的返回值。

经过验证发现推论是那么完美,只要扩展SelectMany方法,代码完美运行。

不过悲剧也发生了,from...in... from... in... from... in... select,三重循环该如何重载呢还是SelectMany方法吗?我完全找不到北了,编译不成功,扩展失败,这是一个悲剧,希望知道的人告诉我结果~~~~~~~

你所不知道的linq(二)的更多相关文章

  1. 你所不知道的linq

    问题的提出 昨天在qq群问了一个linq的问题被人鄙视了.题目大概类似于 var reuslt=from s in new List<string>() select s; 问from.. ...

  2. JavaScript中你所不知道的Object(二)--Function篇

    上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.Str ...

  3. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  4. 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

    目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...

  5. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  6. 你所不知道的html5与html中的那些事第三篇

    文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...

  7. 你所不知道的Html5那些事(一)

    文章简介:       关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后 ...

  8. 闭包----你所不知道的JavaScript系列(4)

    一.闭包是什么? · 闭包就是可以使得函数外部的对象能够获取函数内部的信息. · 闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. · 闭包就 ...

  9. Android Context完全解析,你所不知道的Context的各种细节

    Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了.但是这并不代表Context没有什么东西好讲的,实际上Context有太多小的细节并不被大家所关注,那么今天我们就来学 ...

随机推荐

  1. 【开源】.Net Aop(静态织入)框架 BSF.Aop

    BSF.Aop .Net 免费开源,静态Aop织入(直接修改IL中间语言)框架,类似PostSharp(收费): 实现前后Aop切面和INotifyPropertyChanged注入方式. 开源地址: ...

  2. 玩转Vim 编辑器

    一:VIM快速入门 1.vim模式介绍 以下介绍内容来自维基百科Vim 从vi演生出来的Vim具有多种模式,这种独特的设计容易使初学者产生混淆.几乎所有的编辑器都会有插入和执行命令两种模式,并且大多数 ...

  3. [转载]Cookie/Session的机制与安全

    Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...

  4. 基于window7+caffe实现图像艺术风格转换style-transfer

    这个是在去年微博里面非常流行的,在git_hub上的代码是https://github.com/fzliu/style-transfer 比如这是梵高的画 这是你自己的照片 然后你想生成这样 怎么实现 ...

  5. 使用EF CodeFirst 创建数据库

    EntityFramework 在VS2015添加新建项时,选择数据->ADO.NET 实体数据模型,有一下选项 来自数据库的EF设计器,这个就是我们最常用的EntityFramework设计模 ...

  6. Lesson 17 Always young

    Text My aunt Jennifer is an actress. She must be at least thirty-five years old. In spit of this, sh ...

  7. 【JavaScript吉光片羽】遭遇IE8

    最初对做兼容性的认知只停留在UI层面,但其实UI层面都还好,因为毕竟你可以直接看得见现象,更为重要的是在JavaScript层面,因为这个部分涉及到功能性,前者最多是体验性的问题.下面扯一下这几天遇到 ...

  8. js中几种实用的跨域方法原理详解(转)

    今天研究js跨域问题的时候发现一篇好博,非常详细地讲解了js几种跨域方法的原理,特分享一下. 原博地址:http://www.cnblogs.com/2050/p/3191744.html 下面正文开 ...

  9. ASP.NET MVC 视图(三)

    ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...

  10. dom 操作

    1.dom 的查找 (1)根据id 查找 var object = document.getElementById("id 值"): (2)根据 name 查找:返回 dom 对象 ...