假設要找出整型集合中小於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表示式、事件系列”包括: