本次任务为查找列表中符合特定条件的所有元素,即找出价格高于$10的产品
C#1.0
需要循环,测试和打印,代码如下:
ArrayList products = Product.GetSampleProducts();
foreach (Product product in products)
{
if (product.Price > 10m)
{
Console.WriteLine(product);
}
}
代码很简洁,但3个任务纠缠依赖性不好。
原话如下:请注意3个任务是如何纠缠在一起的:用foreach进行循环,用if测试条件,再用Console.WriteLine显示产品,这3个任务的依赖性一目了然,看看它们是如何嵌套的就明白了。
C#2.0 的代码如下:
List<Product> products = Product.GetSampleProducts();
Predicate<Product> test = delegate(Product p)
{
return p.Price > 10m;
};
List<Product> mathes = products.FindAll(test);
Action<Product> print = delegate(Product p)
{
Console.WriteLine(p);
};
mathes.ForEach(print)
代码复杂了很多,但也强大了很多,可以非常轻松地更改测试条件并对每个匹配项采取单独的操作。
涉及的委托变量(test和print)可以传递给一个方法——相同的方法可以用于测试完全不同的条件以及执行完全不同的操作。
【完全不解,此处何意。。。】
2.0代码亦可优化,如下:
List<Product> products = Product.GetSampleProducts();
products.FindAll(delegate(Product p) { return p.Price > 10; })
.ForEach(delegate(Product p) { Console.WriteLine(p); });
代码简洁了很多,但delegate(Product P)还是很碍事,大括号也是,有损可读性,
C# 3.0 代码如下:
List<Product> products = Product.GetSampleProducts();
foreach (Product product in products.Where(p => p.Price > 10))
{
Console.WriteLine(product);
}
采用Lambda表达式来测试。
灵活性以及可读性很好。
本次涉及到不熟悉的知识点:
1、Predicate<Product> :表示定义一组条件并确定指定对象是否符合这些条件的方法;
2、products.FindAll(test):检索与指定谓词定义的条件匹配的所有元素
3、Action<Product>:封装一个方法,该方法只采用一个参数并且不返回值
4、mathes.ForEach(print):对List<Product>的每个元素进行指定操作。