笔记3
接下来,让我们来做点不同的事情吧,比如查询。
找个价格大于10美元的Product.
在1.0中可能这样写:
ArrayList products = Product.GetSampleProducts();
foreach (Product product in products)
{
if (product.Price > 10m)
{
Console.WriteLine(product);
}
}
很简单,是人就应该这样想。
看看2.0中的样子:
List<Product> products = Product.GetSampleProducts();
Predicate<Product> test = delegate(Product p)
{ return p.Price > 10m; };
List<Product> matches = products.FindAll(test);
Action<Product> print = delegate(Product p)
{ Console.WriteLine(p); };
matches.ForEach(print);
虽然书中大力宣扬这种做法相对于1.0是如何如何好,可我倒并不这样认为-相反,我倒认为问题有些更复杂化的嫌疑。
2.0的另外一种做法:
List<Product> products = Product.GetSampleProducts();
products.FindAll(delegate(Product p) { return p.Price > 10; })
.ForEach(delegate(Product p) { Console.WriteLine(p); });
恩,比前一种做法感觉要好,虽然还是稍显复杂,却有了“一气呵成”的感觉…
看看3.0的做法吧
List<Product> products = Product.GetSampleProducts();
foreach (Product product in products.Where(p => p.Price > 10))
{
Console.WriteLine(product);
}
很简单吧,似乎一看就知道代码要干什么(用原文的话来说就是understand it without even thinking~)
我们似乎已经感觉到了变化:匿名方法让委托变得简单,而lambda表达式又变得更简洁,事物再向越来越美好的方向发展了~
需求是不断变更的,假如要是我们不知道某个Product的price到底有没有,那这种情况该如何解决呢?
浙公网安备 33010602011771号