`
RednaxelaFX
  • 浏览: 3015158 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

LINQ的恶搞……

    博客分类:
  • C#
阅读更多
在去年QCon SF的一个访谈里,Erik Meijer提到可以把这样一个lambda表达式:
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 中不可行。

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 写道
巨诡异的代码,没看懂&nbsp;

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  
巨诡异的代码,没看懂 

相关推荐

    c#.net Linq to sql

    易懂、简便,简单方便的介绍了Linq to sql,让你更轻松的了解Linq…………

    LINQ 实战 7/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    2008.精通LINQ数据访问技术pdf及源码

    全面介绍LINQ基本架构、技术原理、查询操作等内容深入剖析C#3.0中支持LINQ的语法功能涵盖LINQ to ... 本书不仅适合LINQ的初学者,而且对.NET数据处理人员、ASP.NET开发人员和Windows Form开发人员都有非常大的帮助……

    LINQ入门教程(Linq Lambda)

    为啥会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由——以一种统一的方式操作各种数据源,减少数据访问...

    LINQ 实战 1/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ 实战 3/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ 实战 4/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ 实战 2/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ 实战 11/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ 实战 5/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ 实战 6/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ 实战 8/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ 实战 10/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ 实战 9/11

     本书作者是LINQ社区中的重要成员,他们在书中展示了这一技术的精髓……快去享受这一盛宴吧。  ——Matt Warren,微软主架构师,LINQ之父  LINQ方面的杰作!深入、全面、客观,令人欲罢不能。强烈推荐!  ——...

    LINQ中文教程(重新整理)

     为啥会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由——以一种统一的方式操作各种数据源,减少数据...

    LINQ中文教程.pdf

    数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就 有了LINQ 诞生的理由——以一种统一的方式操作各种数据源,减少数据访问的 复杂性。 LINQ 带来很多开发上的便利。首先,他可以利用Visual ...

    利用Linq + Ajax 异步分页实现单个删除,批量删除

    此资源为利用Linq + Jquery + Ajax 异步分页的实现 的升级版,里面包含批量删除,单个删除,全选,反选等操作,可以用于商业开发……

    LINQ入门教程

    为啥会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由——以一种统一的方式操作各种数据源,减少数据访问...

    linq标准查询操作符

    相比于传统的链接数据库对数据库的操作,用linq查询数据库方便快捷……

    微软PetShop合集(2.0,3.0,4.0,5.0)

    微软PetShop合集从2.0-5.0,涵盖.NET Framework从1.0-3.5,增加了LINQ……

Global site tag (gtag.js) - Google Analytics