笔记2
嗯哼,接下来我们想对上述的Product排一个序,那么我们首先必须定义自己的一个排序规则,也就是定义一个排序类。恩,既然是要排序,我们先必须实现ICompare接口,就像下面那样:
class ProductNameComparer : IComparer
{
public int Compare(object x, object y)
{
Product first = (Product)x;
Product second = (Product)y;
return first.Name.CompareTo(second.Name);
}
}
然后调用时:
static void Main()
{
ArrayList products = Product.GetSampleProducts();
products.Sort(new ProductNameComparer());
foreach (Product product in products)
{
Console.WriteLine(product);
}
}
看的出来,我们的Product是以Name为依据进行排序的,然后我们还想让他再以Name的基础再按照价格进行一个排序呢,貌似我们有些束手无策了~
再者,我们看到,我们自定义的ProductNameComparer 类中存在着危险的cast,如果我们返回的Arraylist中存在这一个String的话,那么不好意思,代码就挂啦~其次,在调用时也是存在cast的,只是不明显罢了~(经他这么一说,咦,缺点还真不少哩)
让我们来看看C#2.0中是个什么样子:
class ProductNameComparer : IComparer<Product>
{
public int Compare(Product first, Product second)
{
return first.Name.CompareTo(second.Name);
}
}
static void Main()
{
List<Product> products = Product.GetSampleProducts();
products.Sort(new ProductNameComparer());
foreach (Product product in products)
{
Console.WriteLine(product);
}
}
哇哈,代码简洁了好多啦,没有危险的cast,foeeach中没有了隐式转换…
变换一下:
List<Product> products = Product.GetSampleProducts();
products.Sort(delegate(Product first, Product second)
{ return first.Name.CompareTo(second.Name); }
);
foreach (Product product in products)
{
Console.WriteLine(product);
}
嗯哼,发现没,我们上文中的ProductNameComparer类俨然已经消失了,实际上delegate关键字是生成了一个委托实例,提供了一个排序方法来进行比较…其实这是一个匿名方法啦(anonymous method).匿名方法,这是C#2.0出现的一个很重要的特性。
再来看看C#3.0是个什么样子吧~
List<Product> products = Product.GetSampleProducts();
products.Sort(
(first, second) => first.Name.CompareTo(second.Name)
);
foreach (Product product in products)
{
Console.WriteLine(product);
}
=>这种奇怪的语法(其实见怪不怪了)叫做lambda Expression,其实他在背地里还是搞了一个Comparsion<Product>的委托的,但是我们已然看不到delegate这个小东东啦,first,second这2个参数也不用指定类型啦。(其实嘛,都是语法糖-syntax sugar,编译器的功劳)
再来看C#3.0的另外一种方式:
List<Product> products = Product.GetSampleProducts();
foreach (Product product in products.OrderBy(p => p.Name))
{
Console.WriteLine(product);
}
什么???这么简单,没搞错吧。恩,是滴,这就要归功了俺们的扩展方法(extension method)。更重要的是,我们的编程思维悄然发生了改变,以前我们都是要怎么做(how to do),追求一个过程,其实也就是命令式语言(imperative),而现在是做什么(what to do),也就是声明式编程(declartive).比如说这个,要排序时吗,那就排序好了(OrderBy)。很直接~其实这也是思维的改变。
我们再来总结一下吧:

很简单吧,不是吗?
浙公网安备 33010602011771号