您的位置:首页 > 其它

委托、Lambda表达式、事件系列02,什么时候该用委托

2014-10-01 11:01 567 查看
假设要找出整型集合中小于5的数。

static void Main(string[] args)
{
IEnumerable<int> source = new List<int>(){2, 3, 4, 5, 6, 7, 8, 9,10, 11};
var result = GetNumbersLessThanFive(source);
foreach (int n in result)
    {
Console.WriteLine(n);
}
}
static IEnumerable<int> GetNumbersLessThanFive(IEnumerable<int> numbers)
{
foreach (int number in numbers)
    {
if (number < 5) yield return number;
}
}


如果要找出整型集合中小于10的数,可能首先想到的是增加一个方法。

static IEnumerable<int> GetNumbersLessThanTen(IEnumerable<int> numbers)
{
foreach (int number in numbers)
    {
if (number < 10) yield return number;
}
}


其实,GetNumbersLessThanFive方法和GetNumbersLessThanTen方法简直太像了,就if语句不一样。虽然if语句不一样,但逻辑是一样的:输入一个整型数,输出bool类型。这正是委托该登场的时候!

先声明一个委托,接收int类型参数,返回bool值。现在,if语句可以用委托来替代了,因为委托参数列表和返回类型与if语句吻合。

internal delegate bool MyCalculateDelegate(int val);
class Program
{
static void Main(string[] args)
{
IEnumerable<int> source = new List<int>(){2, 3, 4, 5, 6, 7, 8, 9,10, 11};
MyCalculateDelegate del = LessThanFive;
var result = GetNumbers(source,del);
foreach (int n in result)
    {
Console.WriteLine(n);
}
}
static IEnumerable<int> GetNumbers(IEnumerable<int> numbers, MyCalculateDelegate del)
{
foreach (int number in numbers)
    {
if (del(number)) yield return number;
}
}
static bool LessThanFive(int val)
{
return val < 5;
}
static bool LessThanTen(int val)
{
return val < 10;
}
}

可见,当多个方法有重复的部分,且输入类型一致,返回类型一致,就可以考虑使用委托了。

“委托、Lambda表达式、事件系列”包括:

委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

委托、Lambda表达式、事件系列02,什么时候该用委托

委托、Lambda表达式、事件系列03,从委托到Lamda表达式

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

委托、Lambda表达式、事件系列05,Action委托与闭包

委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

委托、Lambda表达式、事件系列07,使用EventHandler委托

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: