你所不知道的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,有空还是多看看开源代码,那是真的

时间: 2024-10-29 19:10:14

你所不知道的linq的相关文章

你所不知道的html5与html中的那些事(二)

文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作都可以达到真正的云方式呢?这一系列的问题你是否已经想明白了呢? 本系列文章将为您一一解答你所不知道的关于html5与html中的那些事;具体会包括如:html5新的理念与想法,html5的新标签的用意与具体开发中场景应用,html5与css3的感情经历(用法搭配),包括html5的父亲html的一些

你所不知道的html5与html中的那些事(一)

分类: Web开发 文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作都可以达到真正的云方式呢?这一系列的问题你是否已经想明白了呢? 本系列文章将为您一一解答你所不知道的关于html5与html中的那些事;具体会包括如:html5新的理念与想法,html5的新标签的用意与具体开发中场景应用,html5与css3的感情经历(用法搭配),包括html5

JavaScript你所不知道的困惑(2)

困惑一: var obj1 = new Object(); var obj2 = obj1; obj1.name = "阳光小强"; alert(obj2.name); //输出结果:阳光小强 JavaScript中的5个基本类型:Undefined.Null.Boolean.Number和String都是按值访问的,可以操作保存在变量中的实际的值,内存空间如下: var num1 = 5; var num2 = num1; 引用类型的值是保存在内存中的对象,JavaScript不允许

JavaScript你所不知道的困惑(1)

困惑一: 先看一个例子: function test(){ message = "hi"; } test(); alert(message); 会输出字符串"hi" 在函数内部使用var定义的变量是局部变量,省略var操作符的变量是全局变量. 困惑二: alert(undefined == null) 结果是"true" 我们知道在js中分为基本类型和引用类型,基本类型包括number.string.boolean.undefined.null.

你所不知道的html5与html中的那些事(四)——文本标签

文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作都可以达到真正的云方式呢?这一系列的问题你是否已经想明白了呢? 本系列文章将为您一一解答你所不知道的关于html5与html中的那些事;具体会包括如:html5新的理念与想法,html5的新标签的用意与具体开发中场景应用,html5与css3的感情经历(用法搭配),包括html5的父亲html的一些

你所不知道的html5与html中的那些事(三)

文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作都可以达到真正的云方式呢?这一系列的问题你是否已经想明白了呢? 本系列文章将为您一一解答你所不知道的关于html5与html中的那些事;具体会包括如:html5新的理念与想法,html5的新标签的用意与具体开发中场景应用,html5与css3的感情经历(用法搭配),包括html5的父亲html的一些

你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程,并且根据加载过程中所遇到的一系列问题提供解决方案. 其实SQL Server作为微软的一款优秀RDBMS,它启动的过程中,本身所带的那些系统库发生问题的情况相对还是很少的,我们在平常使用中,出问题的大部分集中于我们自己建立的用户数据库. 而且,相对于侧重面而言,其实我们更关注的是我们自己建立的用户数

[那些你所不知道的鬼畜写法]数据结构小探

我有种要出系列的节奏? 这次记一下我所遇到过的数据结构一些神奇的维护方法:  (只是记一下而已,也许会仔细讲讲) 1.差分大法 出自 zkw 大神 <统计的力量——线段树全接触>,运用面虽然不广,但每次用出来威力都是相当大 机智的减少你的代码量 2.保存操作而不是值 出自 clj 大神 在 WC 上对可追溯数据结构的论文(跪跪跪跪),虽然 OI 中应该(?)不会用到吗,但是思路还是很好的 只保存操作在很多时候效果非凡,以时间为权值维护一棵 splay 或是别的支持区间操作的平衡树,然后不但支持

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

转载至 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context