六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

.NET 2.0 基礎(chǔ)類庫中的范型——Functional Programming

[摘要]Functional ProgrammingFunctional Programming 不是一個新鮮的概念了,例如 C++ 雖然不是一門 Functional Programming 語言,但對它也有變通的支持——通過使用模板,函數(shù)對象(Function Objects)和運算符重載等手段,ST...
Functional Programming
Functional Programming 不是一個新鮮的概念了,例如 C++ 雖然不是一門 Functional Programming 語言,但對它也有變通的支持——通過使用模板,函數(shù)對象(Function Objects)和運算符重載等手段,STL、Boost 等庫提供了巧妙無比的、高性能的算法和功能。長久以來似乎 C++ 能實現(xiàn)的這些特性對于諸如 Java 和 C# 這些強調(diào)類型安全的面向?qū)ο蟮木幊陶Z言和框架來說是絕緣的。現(xiàn)在,在 CLR 范型和 C# 2.0 匿名委托的支持下,我們也可以構(gòu)造令人吃驚的 Functional Programming 程序了,而且比 C++ 更加簡單(當(dāng)然性能無法相比,因為 CLR 中的范型是一種運行時技術(shù),而 C++ 中的模板則是編譯時技術(shù))。當(dāng)前 .NET BCL 對 Functional Programming 的支持限于集合類,確切說是 List<T> 和 Array。

我們來看一個簡單的例子。假設(shè)有一個聯(lián)系人列表 List<Contact>,聯(lián)系人的定義如下:



class Contact {

public string Name;

...

}



現(xiàn)在我們要把這個列表中所有聯(lián)系人的姓名拷貝到另外一個列表。你可能馬上就動手寫了出來:



List<Contact> c1 = ...;

List<string> c2 = new List<string>();



foreach (Contact c in c1) {

c2.Add(c.Name);

}



這是一段非常規(guī)矩的 C# 代碼。在 .NET 2.0 中,有了范型和匿名委托,我們可以寫出如下的完成相同功能的實現(xiàn):



List<Contact> c1 = ...;

List<string> c2 = c1.ConvertAll<string>(

delegate(Contact c) { return c.Name; } );



顯然這段代碼比手工編寫的 foreach 代碼更簡捷,在表達意圖方面也顯得更加清楚和直接。其中 ConvertAll 方法是一個范型方法,作用是將列表元素轉(zhuǎn)換為指定類型的列表。原型為:



List<U> ConvertAll<U>(Converter<T, U> converter);



Converter<T, U> 是一個范型委托,指定了如何進行轉(zhuǎn)換(類似 C++ 中的函數(shù)對象),原型為(T 為原始類型,U 為目標類型):



delegate U Converter<T, U>(T from);



這里只是舉了一個簡單的例子,對于更復(fù)雜的情況,范型和匿名委托允許你用更富想象力的方法去實現(xiàn)(例如,匿名委托允許你引用棧上的變量)。

下面是 BCL 中的用于Functional Programming的范型委托(位于 System 命名空間中):



原型
描述

delegate bool Predicate<T>(T obj);
訪問集合時,對指定元素的斷言(true 或 false)

delegate void Action<T>(T obj);
訪問集合時,對指定元素做出特定動作

delegate int Comparison<T>(T x, T y);
比較兩個元素

delegate U Converter<T, U>(T from);
把一個元素轉(zhuǎn)換為另外一個,用于在兩個集合之間拷貝元素




List<T> 提供了如下支持 Functional Programming 的方法:



原型
描述

int FindIndex(Predicate<T> match);

int FindIndex(int index, Predicate<T> match);

int FindIndex(int index, int count, Predicate<T> match);
找出第一個滿足斷言條件的元素的索引

int FindLastIndex(Predicate<T> match);

int FindLastIndex(int index, Predicate<T> match);

int FindLastIndex(int index, int count, Predicate<T> match);
找出最后一個滿足斷言條件的元素的索引

List<T> FindAll(Predicate<T> match);
找出所有滿足斷言條件的元素

Nullable<T> Find(Predicate<T> match);
找出第一個滿足斷言條件的元素

Nullable<T> FindLast(Predicate<T> match);
找出最后一個滿足斷言條件的元素

bool Exists(Predicate<T> match);
判斷滿足斷言條件的元素是否存在

bool TrueForAll(Predicate<T> match);
判斷是否所有的元素都滿足斷言條件

int RemoveAll(Predicate<T> match);
刪除所有滿足斷言條件的元素,返回刪除的元素數(shù)

void ForEach(Action<T> action);
類似 foreach 語句

void Sort(Comparison<T> comparison);
排序

List<U> ConvertAll(Converter<T, U> converter);
轉(zhuǎn)換集合元素




Array 類提供了類似的支持 Functional Programming 的方法,不同之處在于它們都是類方法而非實例方法,在此限于篇幅不再列舉。下面我們來看看前面那個例子換成數(shù)組的話是什么樣子:



Contact[] contacts = ...;

string[] names = Array.ConvertAll<Contact, string>(contacts,

delegate(Contact c) { return c.Name; } );


主站蜘蛛池模板: 人人公开免费超级碰碰碰视频 | 有毛片毛毛片毛片毛片 | 日本一道高清 | 小草福利 | 日本乱中文字幕系列在线观看 | 欧美在线91 | 日韩不卡一区二区 | 青苹果a4yy私人毛片 | 日本一区二区三区中文字幕视频 | 欧美亚洲另类自拍偷在线拍 | 色综合色综合色综合 | 五月深爱网 | 日韩精品欧美高清区 | 三级黄色在线视频中文 | 色羞羞 | 青草国产视频 | 午夜福免费福利在线观看 | 亚洲五月激情 | 中文成人在线视频 | 青青久视频 | 亚洲日本在线观看网址 | 日夜啪| 日韩高清性爽一级毛片免费 | 亚洲xx在线 | 小xav导航福利网址 香蕉中文在线 | 日韩在线国产精品 | 亚洲国产日韩在线观频 | 四虎影院在线看 | 午夜a爱 | 日韩专区中文字幕 | 色偷偷亚洲第一成人综合网址 | 亚洲国产一区二区在线 | 欧美一区日韩一区中文字幕页 | 午夜影院a| 午夜影视污 | 亚洲色图小说 | 五月天婷婷激情网 | 天天干天天玩 | 视频h在线观看 | 日本伊人色 | 婷婷激情五月综合 |