上一篇说了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. 基于ASP.NET/C#开发国外支付平台(Paypal)学习心得。

        最近一直在研究Paypal的支付平台,因为本人之前没有接触过接口这一块,新来一家公司比较不清楚流程就要求开发两个支付平台一个是支付宝(这边就不再这篇文章里面赘述了),但还是花了2-3天的时间通 ...

  2. Opserver开源的服务器监控系统(ASP.NET)

    Opserver是Stack Exchange下的一个开源监控系统,系统本身由C#语言开发的ASP.NET(MVC)应用程序,无需任何复杂的应用配置,入门很快.下载地址:https://github. ...

  3. 原生js+css3实现图片自动切换,图片轮播

    运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...

  4. 浏览器的兼容模式下的button中文字垂直方向不居中显示

    <button style="cursor:pointer;vertical-align: middle;" >删除</button> 这时候垂直不居中. ...

  5. BPM配置故事之案例7-公式计算

    行政主管发来邮件.要求物资明细表增加"单价""总价"."单价"由其审批时填写,"总价"根据"单价"与 ...

  6. Android中的LinearLayout布局

    LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了,  线性布局是按照垂直方向(vertical)或水平方向 ...

  7. Android(安卓)-------CardView

    1.activity_main.xml <android.support.v7.widget.CardView android:id="@+id/cardView" andr ...

  8. VS2015 Git 源码管理工具简单入门

    1.VS Git插件 1.1 环境 VS2015+GitLab 1.2 Git操作过程图解 1.3 常见名词解释 拉取(Pull):将远程版本库合并到本地版本库,相当于(Fetch+Meger) 获取 ...

  9. SQL-日期函数

    GETDATE() :取得当前日期时间 DATEADD (datepart , number, date ),计算增加以后的日期.参数date为待计算的日期:参数number为增量:参数datepar ...

  10. 邻接表的广度优先遍历(java版)

    到 0 的权是 91 到 2 的权是 31 到 3 的权是 61 到 4 的权是 7 2 到 0 的权是 22 到 3 的权是 5 3 到 0 的权是 33 到 4 的权是 1 4 到 2 的权是 2 ...