新特性探究之模擬泛型和內(nèi)置算法的
由于預(yù)授權(quán)完成交易需在預(yù)授權(quán)金額115%范圍內(nèi)予以付款承兌 在C#2.0中,匿名方法、IEnumerable接口和匿名方法的合作,使很多的編程任務(wù)變得非常的簡(jiǎn)單,而且寫(xiě)出來(lái)的程序非常的優(yōu)美。
比如,我們可以寫(xiě)出如下的代碼:
List<Book> thelib = tbooks();
List<Book> found = ndAll(delegate(Book curbook)
{
if (artsWith(\"...\"))
return true;
return false;
});
foreach (Book b in found)
iteLine(bn);
這段程序非常簡(jiǎn)單的展示給我們需要查找的信息,代碼也非常的直接易懂。內(nèi)置的數(shù)據(jù)結(jié)構(gòu)給了我們強(qiáng)大的算法支持,不過(guò),能不能夠?yàn)樽远x的類(lèi)定義類(lèi)似的算法呢?
比如,如果我有一個(gè)自定義的Library類(lèi)并沒(méi)有使用List<Book>存儲(chǔ)數(shù)據(jù),而是使用某種自定義的數(shù)據(jù)結(jié)構(gòu),我能不能也讓用戶(hù)使用類(lèi)似的語(yǔ)法,忽略存儲(chǔ)細(xì)節(jié)的使用匿名委托來(lái)實(shí)現(xiàn)特定的算法呢?
答案當(dāng)然是肯定的,而且在C#中實(shí)現(xiàn)這樣的功能是非常的簡(jiǎn)單。
首先讓我們看看FindAll中用到的匿名委托的原型
public delegate bool Predicate<T>(T obj);
很明顯的,上面的代碼等于注冊(cè)了一個(gè)搜索的回調(diào),而在List內(nèi)部定義了某種遍歷的機(jī)制,從而實(shí)現(xiàn)了一個(gè)漂亮的算法結(jié)構(gòu)Closure。
看到了這些,我們就可以定義自己的算法結(jié)構(gòu)了,首先,我定義了一個(gè)如下的類(lèi)
public class MyVec<T>
{
public static MyVec<T> operator +(MyVec<T> a, T b)
{
a._d(b);
return a;
}
public override string ToString()
{
StringBuilder builder = new StringBuilder();
foreach (T a in _list)
{
pend(String());
pend(\",\");
}
string ret = move(ngth - 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._d(i);
}
return t2;
}
// this is the inner object
private List<T> _list = new List<T>();
}
這個(gè)類(lèi)中包含了一個(gè)的List<T>結(jié)構(gòu),主要是為了證實(shí)我們的想法是否可行,事實(shí)上,任何一個(gè)可以支持foreach遍歷的結(jié)構(gòu)都可以作為內(nèi)置的數(shù)據(jù)存儲(chǔ)對(duì)象,我們會(huì)在后面的例子中給出一個(gè)更加復(fù)雜的實(shí)現(xiàn)。
下面是用于測(cè)試這個(gè)實(shí)驗(yàn)類(lèi)的代碼:
static void Main(string[] args)
{
MyVec<int> a = new MyVec<int>();
a += 12;
a += 15;
a += 32;
MyVec<int> b = ndAll(delegate(int x)
{
if (x < 20) return true; return false;
}
);
iteLine(\"vection original\");
iteLine(String());
iteLine(\"vection found\");
iteLine(String());
adLine();
}
編譯,執(zhí)行,程序輸出:
vection original
12,15,32
vection found
32
和我們預(yù)期的完全相同。很明顯的,List內(nèi)部的算法與我們預(yù)期的基本相同。
Predicate<T>僅僅是為了仿照系統(tǒng)的實(shí)現(xiàn)而采用的一個(gè)委托,事實(shí)上可以使用自己定義的任何委托作為回調(diào)的函數(shù)體。
通過(guò)使用IEnumberable接口,可以實(shí)現(xiàn)對(duì)任意結(jié)構(gòu)的遍歷,從而對(duì)任何數(shù)據(jù)結(jié)構(gòu)定義強(qiáng)大的算法支持。
查看本文來(lái)源
急性腸胃炎可以吃什么唐山醫(yī)院男科哪家醫(yī)院好
有傷口吃什么愈合的快
- 成功前的鋪墊:一個(gè)人若能做這3點(diǎn),他一生的高度將不會(huì)太低
- 為啥你家大頭不好帶?多是因?yàn)閼言袝r(shí)你做過(guò)這些事,媽媽都該重視
- 山東首批省級(jí)考古遺存公園立項(xiàng)名單公布
- 立了秋,再貴也要特別吃這肉,滋養(yǎng)潤(rùn)燥,好吃不上火,滿(mǎn)滿(mǎn)的膠原
- 小時(shí)候上新東方的課,小時(shí)候了買(mǎi)新東方的貨
- 立秋后這菜1元1斤,曬一曬價(jià)格暴跌50倍,放1年不壞,冬天燜肉特香
- 口罩!口罩!口罩!杭州衛(wèi)健委最新提示
- 《太平廣記》走紅帶火國(guó)風(fēng)女裝 “仙氣”、“國(guó)風(fēng)”成熱搜詞
- 【第一直播間】針灸科、亞健康科與婦科他的團(tuán)隊(duì)的聯(lián)合主題直播來(lái)啦!
- 新書(shū)架 | 為什么長(zhǎng)江如此迷人?關(guān)于長(zhǎng)江的一次嚴(yán)肅的“水邊調(diào)查”
- 給狗狗洗澡的時(shí)候有哪些地要特別留意的位置
- 具有什么樣特征的古代牧羊犬不能購(gòu)買(mǎi)位置