C#2.0新特性探究之模拟泛型和内置算法
生活随笔
收集整理的這篇文章主要介紹了
C#2.0新特性探究之模拟泛型和内置算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
作者:?Leafwiz ???來自:網(wǎng)絡(luò)
???? 在C#2.0中,匿名方法、IEnumerable接口和匿名方法的合作,使很多的編程任務(wù)變得非常的簡單,而且寫出來的程序非常的優(yōu)美。
??
?? 比如,我們可以寫出如下的代碼:
??
??List<Book> thelib = Library.getbooks();
??
??List<Book> found = thelib.FindAll(delegate(Book curbook)
??{
?? if (curbook.isbn.StartsWith("..."))
?? return true;
?? return false;
??});
??
??foreach (Book b in found)
??Console.WriteLine(b.isbn);
??
?? 這段程序非常簡單的展示給我們需要查找的信息,代碼也非常的直接易懂。內(nèi)置的數(shù)據(jù)結(jié)構(gòu)給了我們強(qiáng)大的算法支持,不過,能不能夠?yàn)樽远x的類定義類似的算法呢?
??
?? 比如,如果我有一個自定義的Library類并沒有使用List<Book>存儲數(shù)據(jù),而是使用某種自定義的數(shù)據(jù)結(jié)構(gòu),我能不能也讓用戶使用類似的語法,忽略存儲細(xì)節(jié)的使用匿名委托來實(shí)現(xiàn)特定的算法呢?
??
?? 答案當(dāng)然是肯定的,而且在C#中實(shí)現(xiàn)這樣的功能是非常的簡單。
??
?? 首先讓我們看看FindAll中用到的匿名委托的原型
??
??public delegate bool Predicate<T>(T obj);
??
?? 很明顯的,上面的代碼等于注冊了一個搜索的回調(diào),而在List內(nèi)部定義了某種遍歷的機(jī)制,從而實(shí)現(xiàn)了一個漂亮的算法結(jié)構(gòu)Closure。
??
?? 看到了這些,我們就可以定義自己的算法結(jié)構(gòu)了,首先,我定義了一個如下的類
??
??public class MyVec<T>
??{
?? public static MyVec<T> operator +(MyVec<T> a, T b)
?? {
?? a._list.Add(b);
?? return a;
?? }
?? public override string ToString()
?? {
?? StringBuilder builder = new StringBuilder();
?? foreach (T a in _list)
?? {
?? builder.Append(a.ToString());
?? builder.Append(",");
?? }
?? string ret = builder.Remove(builder.Length - 1, 1).ToString();
?? return ret;
?? }
??
?? public MyVec<T<>findAll(Predicate<T> act)
?? {
?? MyVec<T:>t2 = new MyVec<T>();
?? foreach(T i in _list)
?? {
?? if (act(i))
?? t2._list.Add(i);
?? }
?? return t2;
?? }
??
?? // this is the inner object
?? private List<T> _list = new List<T>();
??}
??
?? 這個類中包含了一個的List<T>結(jié)構(gòu),主要是為了證實(shí)我們的想法是否可行,事實(shí)上,任何一個可以支持foreach遍歷的結(jié)構(gòu)都可以作為內(nèi)置的數(shù)據(jù)存儲對象,我們會在后面的例子中給出一個更加復(fù)雜的實(shí)現(xiàn)。
??
?? 下面是用于測試這個實(shí)驗(yàn)類的代碼:
??
??static void Main(string[] args)
??{
?? MyVec<int> a = new MyVec<int>();
?? a += 12;
?? a += 15;
?? a += 32;
?? MyVec<int> b = a.findAll(delegate(int x)
?? {
?? if (x < 20) return true; return false;
?? }
??);
??
?? Console.WriteLine("vection original");
?? Console.WriteLine(a.ToString());
?? Console.WriteLine("vection found");
?? Console.WriteLine(b.ToString());
?? Console.ReadLine();
??}
??
??
?? 編譯,執(zhí)行,程序輸出:
??
??vection original
??
??12,15,32
??
??vection found
??
??32
??
?? 和我們預(yù)期的完全相同。很明顯的,List內(nèi)部的算法與我們預(yù)期的基本相同。
??
?? Predicate<T>僅僅是為了仿照系統(tǒng)的實(shí)現(xiàn)而采用的一個委托,事實(shí)上可以使用自己定義的任何委托作為回調(diào)的函數(shù)體。
??
?? 通過使用IEnumberable接口,可以實(shí)現(xiàn)對任意結(jié)構(gòu)的遍歷,從而對任何數(shù)據(jù)結(jié)構(gòu)定義強(qiáng)大的算法支持。
?? Added by Admin (2005-10-10 1:30:15)
???? 在C#2.0中,匿名方法、IEnumerable接口和匿名方法的合作,使很多的編程任務(wù)變得非常的簡單,而且寫出來的程序非常的優(yōu)美。
??
?? 比如,我們可以寫出如下的代碼:
??
??List<Book> thelib = Library.getbooks();
??
??List<Book> found = thelib.FindAll(delegate(Book curbook)
??{
?? if (curbook.isbn.StartsWith("..."))
?? return true;
?? return false;
??});
??
??foreach (Book b in found)
??Console.WriteLine(b.isbn);
??
?? 這段程序非常簡單的展示給我們需要查找的信息,代碼也非常的直接易懂。內(nèi)置的數(shù)據(jù)結(jié)構(gòu)給了我們強(qiáng)大的算法支持,不過,能不能夠?yàn)樽远x的類定義類似的算法呢?
??
?? 比如,如果我有一個自定義的Library類并沒有使用List<Book>存儲數(shù)據(jù),而是使用某種自定義的數(shù)據(jù)結(jié)構(gòu),我能不能也讓用戶使用類似的語法,忽略存儲細(xì)節(jié)的使用匿名委托來實(shí)現(xiàn)特定的算法呢?
??
?? 答案當(dāng)然是肯定的,而且在C#中實(shí)現(xiàn)這樣的功能是非常的簡單。
??
?? 首先讓我們看看FindAll中用到的匿名委托的原型
??
??public delegate bool Predicate<T>(T obj);
??
?? 很明顯的,上面的代碼等于注冊了一個搜索的回調(diào),而在List內(nèi)部定義了某種遍歷的機(jī)制,從而實(shí)現(xiàn)了一個漂亮的算法結(jié)構(gòu)Closure。
??
?? 看到了這些,我們就可以定義自己的算法結(jié)構(gòu)了,首先,我定義了一個如下的類
??
??public class MyVec<T>
??{
?? public static MyVec<T> operator +(MyVec<T> a, T b)
?? {
?? a._list.Add(b);
?? return a;
?? }
?? public override string ToString()
?? {
?? StringBuilder builder = new StringBuilder();
?? foreach (T a in _list)
?? {
?? builder.Append(a.ToString());
?? builder.Append(",");
?? }
?? string ret = builder.Remove(builder.Length - 1, 1).ToString();
?? return ret;
?? }
??
?? public MyVec<T<>findAll(Predicate<T> act)
?? {
?? MyVec<T:>t2 = new MyVec<T>();
?? foreach(T i in _list)
?? {
?? if (act(i))
?? t2._list.Add(i);
?? }
?? return t2;
?? }
??
?? // this is the inner object
?? private List<T> _list = new List<T>();
??}
??
?? 這個類中包含了一個的List<T>結(jié)構(gòu),主要是為了證實(shí)我們的想法是否可行,事實(shí)上,任何一個可以支持foreach遍歷的結(jié)構(gòu)都可以作為內(nèi)置的數(shù)據(jù)存儲對象,我們會在后面的例子中給出一個更加復(fù)雜的實(shí)現(xiàn)。
??
?? 下面是用于測試這個實(shí)驗(yàn)類的代碼:
??
??static void Main(string[] args)
??{
?? MyVec<int> a = new MyVec<int>();
?? a += 12;
?? a += 15;
?? a += 32;
?? MyVec<int> b = a.findAll(delegate(int x)
?? {
?? if (x < 20) return true; return false;
?? }
??);
??
?? Console.WriteLine("vection original");
?? Console.WriteLine(a.ToString());
?? Console.WriteLine("vection found");
?? Console.WriteLine(b.ToString());
?? Console.ReadLine();
??}
??
??
?? 編譯,執(zhí)行,程序輸出:
??
??vection original
??
??12,15,32
??
??vection found
??
??32
??
?? 和我們預(yù)期的完全相同。很明顯的,List內(nèi)部的算法與我們預(yù)期的基本相同。
??
?? Predicate<T>僅僅是為了仿照系統(tǒng)的實(shí)現(xiàn)而采用的一個委托,事實(shí)上可以使用自己定義的任何委托作為回調(diào)的函數(shù)體。
??
?? 通過使用IEnumberable接口,可以實(shí)現(xiàn)對任意結(jié)構(gòu)的遍歷,從而對任何數(shù)據(jù)結(jié)構(gòu)定義強(qiáng)大的算法支持。
?? Added by Admin (2005-10-10 1:30:15)
轉(zhuǎn)載于:https://www.cnblogs.com/coolcat/archive/2005/10/17/256295.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的C#2.0新特性探究之模拟泛型和内置算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个职场小白想当程序员,该从哪学起?做好
- 下一篇: Firebug Command Line