假设要找出整型集合中小于5的数。
static void Main(string[] args)
{
IEnumerable source = new List (){2, 3, 4, 5, 6, 7, 8, 9,10, 11};
var result = GetNumbersLessThanFive(source);
foreach (int n in result)
{
Console.WriteLine(n);
}
}
static IEnumerable GetNumbersLessThanFive(IEnumerable numbers)
{
foreach (int number in numbers)
{
if (number < 5) yield return number;
}
}
如果要找出整型集合中小于10的数,可能首先想到的是增加一个方法。
static IEnumerable GetNumbersLessThanTen(IEnumerable 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 source = new List (){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 GetNumbers(IEnumerable 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表达式、事件系列”包括: