EduLINQ 尝试解释 LINQ to Objects 运算符是如何工作的。 MoreLINQ 是一组 LINQ to Objects 运算符,它扩充了标准的运算符。 LINQBridge 把 LINQ to Objects 移植到.NET Framework 2.0。
Jonathan Skeet ,从 03 年开始获得微软 C# MVP 称号,也是《C# in Depth》一书的作者,前不久完成了 EduLINQ 项目,它重新实现了 LINQ to Objects,并解释 LINQ 方法是如何工作的。这个项目是在 Apache License 2.0 下发布的,附带了针对.NET Framework 3.5 的源代码和单元测试。下面是 Skeet 从中学到的东西:
- LINQ to Objects 基于扩展方法、委托和 IEnumerable
; - 运算符会在合适的地方使用延迟执行,并且尽可能以流的方式传递数据;
- 运算符不会改变原本的数据,而是返回一个新的序列,这个序列会返回相应的数据;
- 查询表达式基于编译器的模式转换,除了相关查询表达式需要的模式之外,你不必实现其它的;
- 迭代器代码块非常适合实现延迟执行;
- 但会使即时验证参数成为问题;
Skeet 还创建了一个名为 MoreLINQ 的项目,这个类库包含了 21 个运算符,扩充了标准的 LINQ to Objects 运算符。其中一些如下:
- Batch——把源序列分割成指定大小的子序列。
- Consume——完全使用给定的序列。这个方法使用了即时执行,并且不会在执行的时候保存任何数据。(译者注:此方法只是简单地使用 foreach 遍历源序列,foreach 里不包含任何代码)
- EquiZip——返回元祖(tuple)的投影(projection),每个元祖包含了每个参数序列的第 N 个元素。
- MaxBy——根据给定的投影返回给定的序列的最大元素。
- Scan——对元素序列上执行扫描(包含前缀的求和)。
- Zip——“返回元祖的投影每个元祖包含每个参数序列的第 N 个元素。”(译者注:Zip 方法和 EquiZip 方法的区别在于当两个输入序列的长度不等时,前者会以元素较少的为准,剩余的元素将被忽略,而后者将会抛出异常)
LINQBridge 把 LINQ to Objects 移植到.NET Framework 2.0,为那些不得不使用旧版本的开发者提供 LINQ 的灵活和强大。
查看英文原文: LINQ to Objects Projects: EduLINQ, MoreLINQ, and LINQBridge
评论