有下面一段代码:string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };            IEnumerable<string> outerQuery = names
              .Where(n => n.Length == names.OrderBy(n2 => n2.Length)
                                            .Select(n2 => n2.Length).First());
            foreach (string str in outerQuery)
            {
                Console.Write(str + " | ");
            }
            //----------------------------------------------
            IEnumerable<string> query2 = names.OrderBy(n2 => n2.Length)
                                              .Select(n2 => n2);
            Console.ReadKey();
Lambda 表达式就是匿名函数. "编译器会将 LINQ 表达式编译成委托,然后作为参数传递给相应的扩展方法。"编译后的结果:    string[] names = new string[] { "Tom", "Dick", "Harry", "Mary", "Jay" };
    IEnumerable<string> outerQuery = names.Where<string>(delegate (string n) {
        return n.Length == names.OrderBy<string, int>(n2 => n2.Length).Select<string, int>(((Func<string, int>) (n2 => n2.Length))).First<int>();
    });
    foreach (string str in outerQuery)
    {
        Console.Write(str + " | ");
    }
    IEnumerable<string> query2 = names.OrderBy<string, int>(delegate (string n2) {
        return n2.Length;
    }).Select<string, string>(delegate (string n2) {
        return n2;
    });
    Console.ReadKey();query2  只是做个对比, 可以看到,编译后 Lambda 表达式都编译成了delegate. 
IEnumerable<string> query2 = names.OrderBy<string, int>(delegate (string n2) {
        return n2.Length;
    }).Select<string, string>(delegate (string n2) {
        return n2;
但是在outerQuery 中, 只有外层的where中的Lambda表达式 编译成了 delegate , 
而子查询中的orderby 和 select 都没有被编译成delegate 这是为什么呢?望大家帮忙解答! 谢谢!

解决方案 »

  1.   

    编译后,当然是IL代码, 
    我用reflector看的 C# 代码
      

  2.   

    这个没有研究过。.net 3.5 还是比较新的内容。
      

  3.   

    只有外层的where中的Lambda表达式 编译成了 delegate , 
    而子查询中的orderby 和 select 都没有被编译成delegate 这是为什么呢?
    -------------------------------------------------------------------就这么信任reflector???到底是编译器的问题,没完全编译成delegate,
    还是reflector的问题,没完全反编译回来?
    不好说。
      

  4.   


        IEnumerable<string> outerQuery = names.Where<string>(delegate (string n) {
            return n.Length == names.OrderBy<string, int>(n2 => n2.Length).Select<string, int>(((Func<string, int>) (n2 => n2.Length))).First<int>();
        });
    //内层的Func<string,int>就是个delegate啊。
      

  5.   

    首先感谢朋友们的关注!其实, 这只是对代码的一种补全IEnumerable<string> outerQuery=names.Where(n => n.Length == names.OrderBy(n2 => n2.Length).Select(n2=>n2.Length).First());对比两段代码你会发现, 上面的代码中, where 后的 Lambda表达式 被编译为delegate 了,
    对于orderby 和 select , 上面的代码仅仅是对下面代码的一种补全, 上下对比  orderby, select 后面多了个<string, int>  (Func<string, int>)  也是对select的一种补全.
    而 Lambda表达式 却没有被编译为delegate .我困惑的就是  为何这子查询中的 Lambda表达式 没有被编译成delegate.这是为什么呢?关于wuyq11给的参考我这还看不了.... 博客园被网关屏蔽掉了... 痛苦ing....
    谢谢你的帮助!!! 
      

  6.   

    目前,所有没清楚本贴写的是什么的朋友, 试试下面这段代码, 跟踪一下,就该清楚了.
    如果还不清楚的话, 看看t 的值 !
    string str1 = "Mu\x0308nchen";
    string t = "x\x0308";
    string str = "Muchen";
    string find = "Mu";
    Console.WriteLine("Substring: " + (str.Substring(0, 2) == find) + "   Substring is:" +str.Substring(0, 2));
    Console.WriteLine("StartsWith:" + str.StartsWith(find));
    Console.WriteLine("IndexOf:   " + str.IndexOf(find));
      

  7.   

    晕,,,,, 帖子发错地方了....
    http://topic.csdn.net/u/20090415/19/26dfd36a-90f1-4942-820f-4e7ed1d986b5.html?seed=182233927这里
      

  8.   

    http://www.itstrike.cn/Home.mvc/Search/?key=lambda
      

  9.   

    到是看了朋友给的资料
    谢谢最近在学linq 感觉Linq是个好东西, :-)
    就是学起来, 并不那么容易, 3.0有好多东西要看, 看来自己真的需要加把劲儿了.
      

  10.   


    如何编译的?  什么意思?
    你是想说怎么看的结果还是怎么的? 查看是用reflector如果果真如此, 我尽快结贴给分.
    这个验证就只能看IL代码了...  我要验证下, 然后发上来, 谢谢!
      

  11.   

    OrderBy和Select的参数类型其实是Expression<Func<string, int>>,第一种情况下因为没有执行体标记"{}",所以参数就被转换为Expression<Func<string, int>>;而第二种情况下匿名方法的执行体是必须的,所以无法转为换Expression<Func<string, int>>,只能作为一般的委托进行转换。
    如果是dlinq的话那么从用法上说第二种是得不到预期的结果,因为只有Expression才能被转换为正确的sql。
      

  12.   

    另,如果这么用:n=>{n.Length},就是加上执行体标记"{}",应该就和匿名方法一样被转换成委托了。
      

  13.   

    上面写错了,应该是 n=>{return n.Length;}
      

  14.   


    这个第一种情况的, 标记指的是这个大括号中么?IEnumerable<string> outerQuery = names.Where<string>(delegate (string n) {
            return n.Length == names.OrderBy<string, int>(n2 => n2.Length).Select<string, int>(((Func<string, int>) (n2 => n2.Length))).First<int>();
        }为什么说, 第二种情况下执行体是必须的, 而第一种情况下不是呢?
      

  15.   

    C#语法规定匿名方法必须有statement block
      

  16.   

    这个我清楚
    我还要仔细理解下guoyichao ,Thanks!