C#用Lambda和委托實現(xiàn)模板方法
1 問題描述
查看下面這段代碼:
int[] a = [1,2,3];
for (int i =0; i<a.length; i++)
{
a[i] = a[i] * 2;
}
for (int i =0; i<a.length; i++)
{
Console.WriteLine(a[i]);
}
很明顯,上述代碼中存在for循環(huán)的重復(fù)代碼。
2 解決方案
如何消除重復(fù)?使用委托。
•定義委托
delegate int mapfun(int x);//以替換上述代碼中不同的部分
•模板方法
//只負(fù)責(zé)遍歷
void map(mapfun fn, int[] a)
{
for (int i = 0; i < a.Length; ++i)
{
a[i] = fn(a[i]);
}
}
•客戶端代碼
int[] a = {1, 2, 3};
map(delegate(int x) { return x * 2; }, a); //.Net 2.0支持委托匿名方法
map(x => { Console.WriteLine(x); return x; }, a); //.Net 3.0開始支持lambda表達(dá)式
3 完整代碼示例
class Program
{
static void Main(string[] args)
{
int[] a = {1, 2, 3};
map(delegate(int x) { return x * 2; }, a); //.Net 2.0支持委托匿名方法
map(x => { Console.WriteLine(x); return x; }, a); //.Net 3.0開始支持lambda表達(dá)式
}
delegate int mapfun(int x);
static void map(mapfun fn, int[] a)
{
for (int i = 0; i < a.Length; ++i)
{
a[i] = fn(a[i]);
}
}
}
4 與傳統(tǒng)模板方法的比較
1.減少了子類數(shù)量,模板方法中,拓展一套算法就需要一個子類。
2.模板將算法隱藏,委托交由客戶代碼去選擇。
相關(guān)文章
C#使用偽隨機(jī)數(shù)實現(xiàn)加密用戶密碼的方法
這篇文章主要介紹了C#使用偽隨機(jī)數(shù)實現(xiàn)加密用戶密碼的方法,對于開發(fā)C#會員系統(tǒng)或者程序安全問題都有一定的參考借鑒價值,需要的朋友可以參考下2014-07-07
C#判斷頁面中的多個文本框輸入值是否有重復(fù)的實現(xiàn)方法
這篇文章主要介紹了C#判斷頁面中的多個文本框輸入值是否有重復(fù)的實現(xiàn)方法,是一個非常簡單實用的技巧,需要的朋友可以參考下2014-10-10

