有下面一段代码: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 这是为什么呢?望大家帮忙解答! 谢谢!
.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 这是为什么呢?望大家帮忙解答! 谢谢!
解决方案 »
- graphics.DrawString 对齐问题
- 问个问题,串口读并发数据,祝大家农历新年快乐
- fmt文件列号无效
- 怎样快速替换字符串中的字符
- 二进制dat文件转换为txt文件
- FreeTextBox1.6.3 谁用过?该控件的图标怎么不显示
- 如何得到一个窗体的大小(除去边框和菜单)
- List 泛型类 怎么实现IComparable 泛型接口?
- 自己开发的winform如果避免杀毒软件干扰
- 属性是用访问器有什么优点?
- vs2008将90天的试用版,升级为正式版,是真的正式版吗?与直接安装就是正式版的版本有区别吗?可以用于正式的开发项目吗?
- 在gridview控件里删除最后条记录时出现错误,不是最后条记录没问题!!!急!!!
我用reflector看的 C# 代码
而子查询中的orderby 和 select 都没有被编译成delegate 这是为什么呢?
-------------------------------------------------------------------就这么信任reflector???到底是编译器的问题,没完全编译成delegate,
还是reflector的问题,没完全反编译回来?
不好说。
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啊。
对于orderby 和 select , 上面的代码仅仅是对下面代码的一种补全, 上下对比 orderby, select 后面多了个<string, int> (Func<string, int>) 也是对select的一种补全.
而 Lambda表达式 却没有被编译为delegate .我困惑的就是 为何这子查询中的 Lambda表达式 没有被编译成delegate.这是为什么呢?关于wuyq11给的参考我这还看不了.... 博客园被网关屏蔽掉了... 痛苦ing....
谢谢你的帮助!!!
如果还不清楚的话, 看看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));
http://topic.csdn.net/u/20090415/19/26dfd36a-90f1-4942-820f-4e7ed1d986b5.html?seed=182233927这里
谢谢最近在学linq 感觉Linq是个好东西, :-)
就是学起来, 并不那么容易, 3.0有好多东西要看, 看来自己真的需要加把劲儿了.
如何编译的? 什么意思?
你是想说怎么看的结果还是怎么的? 查看是用reflector如果果真如此, 我尽快结贴给分.
这个验证就只能看IL代码了... 我要验证下, 然后发上来, 谢谢!
如果是dlinq的话那么从用法上说第二种是得不到预期的结果,因为只有Expression才能被转换为正确的sql。
这个第一种情况的, 标记指的是这个大括号中么?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>();
}为什么说, 第二种情况下执行体是必须的, 而第一种情况下不是呢?
我还要仔细理解下guoyichao ,Thanks!