- 浏览: 3015158 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
在去年QCon SF的一个访谈里,Erik Meijer提到可以把这样一个lambda表达式:
写成:
原话是:
怪有趣(和无聊=w=)的。
实践一下,代码如下:
连System.Linq都不需要引用,确实能行。呵呵,Erik真欢乐 XDD
话说这代码也能泛化到任意类型:
太邪恶了……(虽然函数不能像F#那样自动泛化比较不爽 =v=)
话说泛化到任意类型之后,编译会得到一个警告:
不过实际上没关系,我们根本就没用过那个null。
======================================================
糟糕,刚才不小心点了提交,直接就发出来了……发的时候标题跟内容是脱节的 OTL
嘛,LINQ的语法是monadic syntax没错,不过跟这帖没关系 =v=
哈哈,那是个常见误区。更糟糕的是很多没用过C# 3.0的以为LINQ跟SQL有什么关系……其实可以完全没有关系。
像是where子句,会被映射到.Where()方法,而这个Where中的lambda是否返回bool类型的值也没关系的;也就是说只要实现了合适的序列运算符,where子句里的值的类型是什么都可以 XD
from X in N select Y其实会被编译器翻译为:
也就是说只要在当前作用域里能找到这么一个Select方法,无论是成员方法还是扩展方法,之要能满足上面这种形式的调用就OK;至于Select方法返回什么类型的值,编译器不关心也不会抱怨
今天我还跟我同事聊到你这个话题,以前我一直都以为from x in XXXXXX,这个XXXXXX必须是个集合,囧rz
我也看了Eric 梅姐的采访,为什么当时没发现这个
因为我在无聊所以我对无聊的对话特别敏感 XDD
Umm...哪部分没懂?看看我能不能解释一下 ^ ^
首先是想要达到的目标:不使用C# 3.0的lambda语法,而使用LINQ语法来写出匿名函数。
利用C# 3.0的lambda语法,可以写出这样的匿名函数:
也就是接受一个int参数,返回int类型结果的这么一个匿名函数。
只有一个参数的时候括号可以省略,只有一个返回语句的时候语句块和return都可以省略,当编译器可以推导出类型的时候类型声明也可以省略。这个语法也可以简化为:
这个lambda表达式就是我们想用LINQ语法所表现的内容。
Eric Meijer说“通过适当的序列(特指LINQ语境)运算符实现,x => x + 1可以写成from x in default(int) select x + 1”。我这帖的内容就是实现这样一个序列运算符。
LINQ的语法限制其实很宽松,from X in N select Y其实会被编译器翻译为:
也就是说只要在当前作用域里能找到这么一个Select方法,无论是成员方法还是扩展方法,之要能满足上面这种形式的调用就OK;至于Select方法返回什么类型的值,编译器不关心也不会抱怨。所以就可以玩很多无聊的东西了 XD
x => x + 1
写成:
from x in default(int) select x + 1
原话是:
Erik Meijer 写道
In my talk on LINQ, I have an example of a really weird implementation that shows that you don't need lambda expressions. If you implement the sequence operator correctly you can say "from x in default(int) select x + 1" and that means "x => x + 1". You can do weird things like that, but again, I think we are very early in the development and when people will discover this, that LINQ is not just for collections, you will see many other applications of it.
怪有趣(和无聊=w=)的。
实践一下,代码如下:
using System; static class Int32Extensions { public static Func<int, TR> Select<TR>(this int i, Func<int, TR> func) { return func; } } static class Program { static void Main(string[] args) { var f = from x in default(int) select x + 1; Console.WriteLine(f.GetType()); // System.Func`2[System.Int32,System.Int32] Console.WriteLine(f(2)); // 3 } }
连System.Linq都不需要引用,确实能行。呵呵,Erik真欢乐 XDD
话说这代码也能泛化到任意类型:
using System; static class TExtensions { public static Func<T, TR> Select<T, TR>(this T obj, Func<T, TR> func) { return func; } } static class Program { static void Main(string[] args) { var f = from s in default(string) select s.Length; Console.WriteLine(f.GetType()); // System.Func`2[System.String,System.Int32] Console.WriteLine(f("oh my")); // 5 } }
太邪恶了……(虽然函数不能像F#那样自动泛化比较不爽 =v=)
话说泛化到任意类型之后,编译会得到一个警告:
引用
warning CS1720: Expression will always cause a System.NullReferenceException because the default value of 'string' is null
不过实际上没关系,我们根本就没用过那个null。
======================================================
糟糕,刚才不小心点了提交,直接就发出来了……发的时候标题跟内容是脱节的 OTL
嘛,LINQ的语法是monadic syntax没错,不过跟这帖没关系 =v=
评论
8 楼
ljs_nogard
2018-06-28
Xamarin workbook - .Net Core 中不可行。
报错
(5,15): error CS1936: Could not find an implementation of the query pattern for source type 'int'. 'Select' not found.
(7,1): error CS1955: Non-invocable member 'mySqr' cannot be used like a method.
using System; using System.Linq; var mySqr = from x in default(int) select x + 1; mySqr(10);
报错
引用
(5,15): error CS1936: Could not find an implementation of the query pattern for source type 'int'. 'Select' not found.
(7,1): error CS1955: Non-invocable member 'mySqr' cannot be used like a method.
7 楼
RednaxelaFX
2009-03-18
lovesanni 写道
今天我还跟我同事聊到你这个话题,以前我一直都以为from x in XXXXXX,这个XXXXXX必须是个集合,囧rz
哈哈,那是个常见误区。更糟糕的是很多没用过C# 3.0的以为LINQ跟SQL有什么关系……其实可以完全没有关系。
像是where子句,会被映射到.Where()方法,而这个Where中的lambda是否返回bool类型的值也没关系的;也就是说只要实现了合适的序列运算符,where子句里的值的类型是什么都可以 XD
6 楼
lovesanni
2009-03-18
引用
from X in N select Y其实会被编译器翻译为:
N.Select(X => Y)
也就是说只要在当前作用域里能找到这么一个Select方法,无论是成员方法还是扩展方法,之要能满足上面这种形式的调用就OK;至于Select方法返回什么类型的值,编译器不关心也不会抱怨
今天我还跟我同事聊到你这个话题,以前我一直都以为from x in XXXXXX,这个XXXXXX必须是个集合,囧rz
5 楼
RednaxelaFX
2009-03-17
night_stalker 写道
我也看了Eric 梅姐的采访,为什么当时没发现这个
因为我在无聊所以我对无聊的对话特别敏感 XDD
4 楼
night_stalker
2009-03-17
我也看了Eric 梅姐的采访,为什么当时没发现这个
3 楼
RednaxelaFX
2009-03-17
lovesanni 写道
巨诡异的代码,没看懂
Umm...哪部分没懂?看看我能不能解释一下 ^ ^
首先是想要达到的目标:不使用C# 3.0的lambda语法,而使用LINQ语法来写出匿名函数。
利用C# 3.0的lambda语法,可以写出这样的匿名函数:
(int x) => { return x + 1; }
也就是接受一个int参数,返回int类型结果的这么一个匿名函数。
只有一个参数的时候括号可以省略,只有一个返回语句的时候语句块和return都可以省略,当编译器可以推导出类型的时候类型声明也可以省略。这个语法也可以简化为:
x => x + 1
这个lambda表达式就是我们想用LINQ语法所表现的内容。
Eric Meijer说“通过适当的序列(特指LINQ语境)运算符实现,x => x + 1可以写成from x in default(int) select x + 1”。我这帖的内容就是实现这样一个序列运算符。
LINQ的语法限制其实很宽松,from X in N select Y其实会被编译器翻译为:
N.Select(X => Y)
也就是说只要在当前作用域里能找到这么一个Select方法,无论是成员方法还是扩展方法,之要能满足上面这种形式的调用就OK;至于Select方法返回什么类型的值,编译器不关心也不会抱怨。所以就可以玩很多无聊的东西了 XD
2 楼
carysun
2009-03-17
这个挺有意思
1 楼
lovesanni
2009-03-17
巨诡异的代码,没看懂
发表评论
-
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22247(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对象的重量
2011-08-21 17:15 0http://domino.research.ibm.com/ ... -
GetCustomAttribute()每次都返回新Attribute实例
2009-11-10 10:30 0Jeffrey Zhao: 一次失败的尝试(上):原来GetC ... -
委托与方法和隐藏参数
2009-09-07 15:32 3242之前正好发了些帖子是关于CLR里的委托的,然后看到老赵说事件也 ... -
要让CLR挂掉的话(第二弹)……
2009-09-04 03:26 12761(Disclaimer:如果需要转 ... -
要让CLR挂掉的话……
2009-09-02 16:53 4692(Disclaimer:如果需要转载请先与我联系。 作者:Re ... -
趣味编程:函数式链表的快速排序
2009-08-31 08:53 3371(恢复自2009-08-28的备份 ... -
事件处理器导致内存泄漏
2009-08-25 15:03 0Memory leak via event handlers ... -
C# 3.0的类型推导
2009-08-23 12:24 0Howard Dierking: Lambda, Lambda ... -
把lock的意思给弄混了 T T
2009-08-20 17:49 2548悲剧啊……前几天有个同学不停问我Java里的同步问题,今天写C ... -
把IEnumerable<T>和IObservable<T>粘起来?
2009-07-23 03:02 0Channel 9: Expert to Expert: Br ... -
Scott Peterson: Variance, Thy Name is Ambiguity
2009-07-01 23:49 1587原文作者:Scott Peterson 原文地址:http:/ ... -
void无法协变
2009-06-30 11:17 0Eric Lippert The void is invari ... -
同一个表达式算出来的浮点数结果会不相等?
2009-05-30 03:27 0浮点数有很多可把玩的地方。例如下面这段C程序: #includ ... -
C#开始默认引用Microsoft.CSharp.dll
2009-05-20 16:14 0记得VB6的运行时么?留意到VB.NET的程序都需要额外的VB ... -
反射与显式实现接口的方法
2009-05-20 11:43 4001在前一帖里,我用到了下面三处Expression.Call() ... -
看到一个关于ref参数与多态的问题,记一下
2009-05-18 10:48 1908刚才读到Alan McGovern的一帖,问为什么形式参数是r ... -
C#的+=运算符两例
2009-05-06 18:18 1972刚偶尔看到了justjavac写的java解惑 - 半斤八两( ...
相关推荐
易懂、简便,简单方便的介绍了Linq to sql,让你更轻松的了解Linq…………
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
全面介绍LINQ基本架构、技术原理、查询操作等内容深入剖析C#3.0中支持LINQ的语法功能涵盖LINQ to ... 本书不仅适合LINQ的初学者,而且对.NET数据处理人员、ASP.NET开发人员和Windows Form开发人员都有非常大的帮助……
为啥会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由——以一种统一的方式操作各种数据源,减少数据访问...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
为啥会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由——以一种统一的方式操作各种数据源,减少数据...
数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就 有了LINQ 诞生的理由——以一种统一的方式操作各种数据源,减少数据访问的 复杂性。 LINQ 带来很多开发上的便利。首先,他可以利用Visual ...
此资源为利用Linq + Jquery + Ajax 异步分页的实现 的升级版,里面包含批量删除,单个删除,全选,反选等操作,可以用于商业开发……
为啥会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由——以一种统一的方式操作各种数据源,减少数据访问...
相比于传统的链接数据库对数据库的操作,用linq查询数据库方便快捷……
微软PetShop合集从2.0-5.0,涵盖.NET Framework从1.0-3.5,增加了LINQ……