- 浏览: 3054394 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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 22413(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 3314之前正好发了些帖子是关于CLR里的委托的,然后看到老赵说事件也 ... -
要让CLR挂掉的话(第二弹)……
2009-09-04 03:26 12884(Disclaimer:如果需要转 ... -
要让CLR挂掉的话……
2009-09-02 16:53 4787(Disclaimer:如果需要转载请先与我联系。 作者:Re ... -
趣味编程:函数式链表的快速排序
2009-08-31 08:53 3453(恢复自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 2605悲剧啊……前几天有个同学不停问我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 1639原文作者: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 4064在前一帖里,我用到了下面三处Expression.Call() ... -
看到一个关于ref参数与多态的问题,记一下
2009-05-18 10:48 1947刚才读到Alan McGovern的一帖,问为什么形式参数是r ... -
C#的+=运算符两例
2009-05-06 18:18 2041刚偶尔看到了justjavac写的java解惑 - 半斤八两( ...
相关推荐
本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。 ——Matt Warren,微软主架构师,LINQ之父 LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
Description = "Widgets are the ……" }; var newProduct = new Product{ ProductName = "Blue Widget", UnitPrice = 34.56M, Category = newCategory }; db.Categories.InsertOnSubmit(newCategory); db....
全面介绍LINQ基本架构、技术原理、查询操作等内容深入剖析C#3.0中支持LINQ的语法功能涵盖LINQ to ... 本书不仅适合LINQ的初学者,而且对.NET数据处理人员、ASP.NET开发人员和Windows Form开发人员都有非常大的帮助……
本书作者是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方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐! ——...
在EF中,两表查询可以通过 LINQ to Entities 来实现,这是一种强大的语言集成查询方式。以下是一个使用LINQ的LEFT JOIN实例: ```csharp using (var context = new YourDbContext()) { var query = (from t1 in ...
为啥会有 LINQ,主要还是因为现在的数据格式越来越多,...数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就 有了 LINQ 诞生的理由——以一种统一的方式操作各种数据源, 减少数据访问的 复杂性
实现所有 .NET 4.0 方法和许多额外的方法(灵感来自 Rx、Achiral、Haskell、Ruby 等……) 完成懒惰评估 两个版本 - linq.js 和 jquery.linq.js(jQuery 插件) 绑定 JavaScript 的响应式扩展(RxJS) 安装 将此行...
6. **LINQ(Language Integrated Query)**:LINQ是一种在C#中集成的查询语言,允许以一致的方式查询各种数据源,如数据库、XML文档、集合等。 7. **异步编程**:C#引入了async和await关键字,使得编写非阻塞的异步...
对数据库中的数据实现各种图表的显示 using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; ...………………
这种方式更符合C#的LINQ风格: ```csharp public static double CalculateAlternatingSeriesWithLinq(int n) { return Enumerable.Range(1, n) .Select((value, index) => (index % 2 == 0) ? -1.0 / value : 1.0...
.NET Framework 4.0 常用类库参考手册 [微软官方 MSDN] MSDN Library - .NET Framework 4.0 - 命名空间 (节选版) 制作成了chm格式,方便离线状态下学习! ======================================= ...……