如果你已经在使用 LINQ,那么这个示例只是提醒,但我们会用它来展示一些更重要的内容。这里示例代码处理数据,使用的是标准的命令式编程风格。
Listing 1.3 Imperative data processing (C#)
IEnumerable<string>GetExpenisveProducts() {
List<string> filteredInfos =
newList<string>(); [1]
foreach(Product product
inProducts) { [2]
if(product.UnitPrice > 75.0M) {
filteredInfos.Add(String.Format("{0} -${1}",
product.ProductName, product.UnitPrice)); [3]
}
}
return filteredInfos;
}
正如你所看到的,代码就是基本的命令序列,是命令式的。第一句创建新的列表[1],第二句遍历所有的产品[2],后面的语句将遍历到的元素添加到列表中[3]。但是,我们希望能够在更高层次上描述这个问题,使用更抽象的术语,即,这段代码筛选一个集合,返回所有符合条件产品的有关信息。
在 C# 3.0 中,写同样的代码,我们可以使用查询表达式。在清单 1.4 中的这个版本,更贴近我们的真正目标,使用同的思想,筛选和转换数据。
Listing 1.4 Declarative data processing(C#)
IEnumerable<string>GetExpenisveProducts() {
return from product
inProducts
where product.UnitPrice > 75.0M [1]
selectString.Format("{0} - ${1}",
product.ProductName, product.UnitPrice); [2]
}
计算结果(filteredInfos [可能是笔误,代码中并无这个变量。应该是筛选后的信息。])的表达式是由基本运算符,例如 select 或 where 所组成。这些运算符把其他表达式作为参数,因为它们需要知道筛选、选择什么作为结果。与前面的代码相比,这些运算符使用全新方法组合代码,同样表达我们的意图,但写的代码更少。注意,在清单 1.4 中的整个计算一个描述结果的表达式,而不是语句序列。你将在整本书反复看到这一趋势,在更具声明性的语言,如 F# 中,所写的一切都是表达式。
这个清单中的另一个有意义的地方是,解决方案的许多技术细节都转到了基本运算符中了。这样,代码更简单,更灵活,因为我们可以只需要改变运算符的实现,而不用对使用运算符的代码做大的修改。稍后将会看到,这种方式使得并行处理数据的代码更容易。
LINQ 并不是唯一依赖声明式编程的主流 .NET 技术,下面,我们把注意力转到 Windows 表现层基础(Windows Presentation Foundation,WPF)和XAML 语言上来。
1.4.1.1 用 LINQ 处理数据