C#高级程序设计(一)——从接口到代理到匿名方法到lambda表达式

问题背景:使用Sort方法对Product对象进行排序。

下面是Sort方法的两个签名:

public void Sort(Comparison<T> comparison);
public void Sort(IComparer<T> comparer);

其中一个是接收实现了IComparer<T>接口的对象,另一种是接收Comparison<T>代理。

一、使用接口对象

class ProductNameComparer : IComparer<Product>
{
public int Compare(Product x, Product y)
{
return x.Name.CompareTo(y.Name);
}
}
...
List<Product> products = Product.GetSampleProducts();
products.Sort(new ProductNameComparer());
foreach (Product product in products)
{
Console.WriteLine(product);
}

二、使用代理

public int Compare(Product x, Product y)
{
    return x.Name.CompareTo(y.Name);
}

List<Product> products = Product.GetSampleProducts();
products.Sort(Compare);
foreach (Product product in products)
{
Console.WriteLine(product.Name);
}

思考:接口和代理究竟有怎样的区别和联系?

接口是类/对象的契约,代理是方法的契约;接口对象只能指向实现了接口的类对象,代理对象只能指向实现了方法签名的方法。

三、匿名方法

匿名方法是代理的进一步扩展,它能将代码块传递给代理对象。下面使用匿名方法对上面代码进行改写。

List<Product> products = Product.GetSampleProducts();
products.Sort(delegate(Product x, Product y)
{ return x.Name.CompareTo(y.Name); }
);
foreach (Product product in products)
{
Console.WriteLine(product);
}

四、lambda表达式

lambda表达式是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托和表达式树类型,下面使用lambda表达式对上面代码进行改写。

List<Product> products = Product.GetSampleProducts();
products.Sort((x, y) => x.Name.CompareTo(y.Name));
foreach (Product product in products)
{
Console.WriteLine(product);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值