【发布时间】:2012-08-04 14:16:08
【问题描述】:
我正在尝试了解谓词和 LINQ。
虽然 LINQ 的语法对我来说开始变得有意义,但我对 LINQ 背后的理论有点麻烦。
这是我目前所拥有的。在设计 LINQ 时,Microsoft 没有创建一个新接口来定义任何可以使用 LINQ 查询的对象都需要实现的每个成员,而是决定采用现有的类 IEnumerable,并使用扩展方法扩展此类。
我想我了解扩展方法。扩展方法是静态类中的静态方法。传入此方法的第一个参数与this 参数一起传入,并定义要扩展的类型。然后,与扩展方法在同一命名空间内的任何该类型的实例都可以使用该方法。
因此,Microsoft 在 System.LINQ 命名空间内创建了许多扩展 IEnumerable 的扩展方法,并且任何使用 System.LINQ 命名空间并包含实现 IEnumerable 的对象的类都可以使用这些扩展方法来查询该对象。这些扩展方法中的每一个都将委托作为其第二个参数。
关于where,where 是一个扩展方法,扩展了 IEnumerable 并返回一个实现 IEnumerable 的新对象。下一个参数where 采用的是 Func(泛型 func)类型的谓词(返回布尔值的方法)。这是一个委托,它返回真或假,最多可以有 16 个参数。但是,不必编写满足此条件的方法,而是创建 Func 类型的实例并将其指向您的方法,并将此变量传递给 where 方法,C# 允许您即时编写它。在构建 LINQ 查询时,您在单词 where 之后添加的所有内容都将成为您的谓词。
在幕后,对实现 IEnumerable 的对象的成员进行迭代并根据您的谓词进行评估,如果是 true,则使用 yield return 语法将其添加到新的 IEnumerable 对象中。
抱歉,如果这看起来有点脱节,但我基本上已经把所有事情都从我的大脑中甩了出来,并希望比我更了解这一点的人会过来告诉我我有哪些正确的地方,位是错误的,并且通常会扩展我上面写的内容,因为我在正确理解这里发生的事情时遇到了一些麻烦。
【问题讨论】:
-
顺便说一句,使用 LINQ 的一个好方法是通过 LINQPad 程序。这是一个很棒的工具!
-
关闭?这个问题有什么问题?如果需要,我会修改,我试图更好地理解一个我认为是本网站目的的关键编程概念!
标签: linq language-theory