你所不知道的linq
- 问题的提出
昨天在qq群问了一个linq的问题被人鄙视了。题目大概类似于
var reuslt=from s in new List<string>() select s;
问from...in...select...中in后面如果接的不是集合,而是一个delegate,会怎么样??之后就被人鄙视了,一些人嘲笑我工作年头是混出来的,in后面当然是数据源了,delegate也可以作为数据源,所以当然可以了。无奈,只能百度——在微软的官网上查到了如下信息:

!!!!!!!!!我的亲娘啊,我现在的代码中from in select 子句的in后面已经跟了delegate,并且是可行的。难道delegate继承自IEnumerable??
打死也不信。微软官网在说谎。那真实的情况是什么样的呢,后来我终于在源码中找到了一个自认为合理的解释,或许这就是from in select 子句的本质,现在分享给大家,如果事实不是这样,欢迎指正。
- 问题的本质
from in select子句肯定会编译成c#代码的,会编译成什么呢?我的猜测是这个子句的三个关键字会一起编译。后来结合源码,分析到其实只要in后面的数据类型Tin实现扩展方法
public static T3 Select<T1, T2,T3>(this Tin tin, Func<T1, T2> selector)
只要实现这个扩展方法,T2类型就可以放到in后面作为数据源。而T1类型就是from子句对象的类型,而select子句的lambda表达式对应的就是Func<T1,T2>selector.
select子句的类型和lambda表达式的入参是一致的。而select返回的类型,不一定是最终返回的类型,而Select扩展方法的返回值会作为最终的返回类型。
多说也不明白,还是给大家上示例代码,一看就明白了。


class Program
{
static void Main(string[] args)
{
var result = from s in new TestApp() { A = 2 } select s;
Console.WriteLine(result.GetType() + " " + result);
Console.ReadLine(); var reuslt = from s in new List<string>() select s;
}
}
public class TestApp
{
public int A { get; set; }
}
public static class SelectExtension
{
public static string Select(this TestApp app, Func<int, int> selector)
{
return "hello,你是" + selector(app.A).ToString();
}
}
- 最后的心得
1,qq群很少能够帮上你忙得,官方文档也是不可靠的。
2,常识很可能是假的
3,有空还是多看看开源代码,那是真的
你所不知道的linq的更多相关文章
- 你所不知道的linq(二)
上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...
- 你所不知道的setInterval
在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...
- 你所不知道的setTimeout
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...
- 你真的会玩SQL吗?你所不知道的 数据聚合
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧
目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...
- 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...
- Android中Context详解 ---- 你所不知道的Context
转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好, ...
- 你所不知道的html5与html中的那些事第三篇
文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...
- 你所不知道的 URL
0.说明 第一幕 产品:大叔有用户反映账户不能绑定公众号.大叔:啊咧咧?怎么可能,我看看?大叔:恩?这也没问题啊,魏虾米.大叔:还是没问题啊,挖叉类.大叔:T T,话说产品姐姐是不是Java提供接口的 ...
随机推荐
- TypeScript Vs2013 下提示Can not compile modules unless '--module' flag is provided
VS在开发TypeScript程序时候,如果import了模块有的时候会有如下提示: 这种情况下,只需要对当前TypeScript项目生成设置为AMD规范即可!
- zookeeper源码分析之六session机制
zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...
- iOS 委托与文本输入(内容根据iOS编程编写)
文本框(UITextField) 本章节继续编辑 JXHypnoNerd .文件地址 . 首先我们继续编辑 JXHypnosisViewController.m 修改 loadView 方法,向 ...
- python中IndentationError: expected an indented block错误的解决方法
IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进
- Android NDK debug 方法
最近又频繁遇到 NDK 的错误,记录一下debug调试的一些经验,以备后续查看 一般来说,在Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 "DEBUG& ...
- DDD中的Unitwork与DomainEvent如何相容?(续)
上篇中说到了面临的问题(传送门:DDD设计中的Unitwork与DomainEvent如何相容?),和当时实现的一个解决方案.在实际使用了几天后,有了新的思路,和@trunks 兄提出的观点类似.下面 ...
- 我的MYSQL学习心得(五) 运算符
我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 如玫瑰一般的PHP与C#混合编程
故事背景是这样的,有一套项目,服务器端是用C#写的,为了完成某种事情,它需要使用到一个组件,这个组件很小但很重要,很不巧的是,这个这个组件是用PHP语言写的,如果为了使用这个组件而专门搭建一个PHP的 ...
- what's deviceone
DeviceOne技术介绍 一. DeviceOne是什么 DeviceOne(以下简称Do)是一个移动开发的平台或技术,与之对等的是Android移动开发技术,iOS移动开发技术,Windo ...
- Android SQLite调试
调试SQLite的神器,再也不用自己去打Log了,只需简单的几个命令. adb shell setprop log.tag.SQLiteLog V adb shell setprop log.tag. ...