这有点依赖于 C#,因为您不能在 VB.Net 中编写迭代器。但对我来说,一个很大的性能改进是迭代器 + 扩展方法 + lambda 表达式组合。 .Net 2.0 中也提供了迭代器,但是当您将它们与 IEnumerable 扩展方法结合使用时,您会突然拥有一个非常强大的优化工具。
例如,假设您有代码读取文件并获取包含某些特定文本的所有行。在 .Net 2.0 中,您可以使用 File.ReadAllLines 或遍历流阅读器。在 .Net 3.5 中,您可以使用迭代器包装流阅读器并编写如下代码:
ReadLines(@"C:\MyFile.txt").Where(l => l.Contains("search text") );
现在这并不是那么特别,因为您可以在 .Net 2.0 中编写接近它的代码。但真正酷的是你可以继续添加过滤器:
var query = ReadLines(@"C:\MyFile.txt")
.Where(l => l.Contains("search text") )
.Select(l => int.Parse(l.SubStrin(5,8))
.Where(i => i > 10 );
int sum=0;
foreach (int value in query)
{
sum += value;
}
小测验——该代码将迭代文件结果多少次?答案正是一个。添加新的.Where() 或.Select() 不会导致它再次循环结果。相反,它推迟执行以为您的枚举创建一种管道。
要在 .Net 2.0 中获得类似的性能,您必须编写一个更长的函数,包括打开和读取文件,拥有一个更复杂的类来实现 IEnumerable,或者广泛使用最常见的自定义委托程序员不会理解的。
这允许您以一种非常简单且非常可重用的方式抽象出读取文件的代码,从而使该语言现在适合编写高效的代码。有趣的部分是您可以从 VB.Net 中使用它:您只需要在某个地方有一个 C# 程序集来保存您想要编写的迭代器,然后您的 VB.Net 代码就会看起来像这样:
Dim query = ReadLines("C:\MyFile.txt") _
.Where(Function(l) l.Contains("search text") ) _
.Select(Function(l) Integer.Parse(l.SubString(5,8) ) _
.Where(Function(i) i > 10 )
Dim sum As Integer = 0
For Each value As Integer In query
sum += value
Next value