你所不知道的linq(二)
2018-06-22 07:42:30来源:未知 阅读 ()
上一篇说了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 = 2 } from i in (s + 2).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方法吗?我完全找不到北了,编译不成功,扩展失败,这是一个悲剧,希望知道的人告诉我结果~~~~~~~
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- asp.net 动态生成表格 2019-01-03
- Linq 使用skip和take分页 2018-06-22
- Linq详细介绍 2018-06-22
- LINQ to SQL语句(1)Select查询的九种形式 2018-06-22
- Linq to SQL 中将数字转换为字符串 2018-06-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash