日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

【C#2.0】发挥匿名委托的威力!

發布時間:2025/3/15 C# 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C#2.0】发挥匿名委托的威力! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這幾天研究了一下Linq,C# 3.0中的“擴展方法”特性為IEnumerable<T>增加了諸如Where、Select等查詢方法,這使得“語言集成查詢”成為順其自然的事情。而C#3.0中Linq的實現也是建立在C#2.0的匿名委托的特性之上。
???今天,我嘗試在C#2.0中使用匿名委托模擬C#3.0中Where、Select等查詢方法的實現。我將所有的查詢方法作為靜態方法在GenericHepler靜態類中實現。
???之前,我們先定義泛型委托:
???public?delegate?TResult?Func<T,?TResult>(T?source); ???這個委托在后面的實現中需要用到。

???作為基礎,首先,我們需要實現ForSpecification方法,該方法的含義是:對集合中滿足指定條件的元素執行指定方法調用。
?????????///?<summary>
????????
///?ForSpecification?對集合中滿足predicate條件的元素執行action。如果沒有條件,predicate傳入null。
????????
///?</summary>???????
????????public?static?void?ForSpecification<TSource>(IEnumerable<TSource>?collection,?Action<TSource>?action,?Predicate<TSource>?predicate)
????????{
????????????
if?(predicate?==?null)
????????????{
????????????????
foreach?(TSource?obj?in?collection)
????????????????{
????????????????????action(obj);
????????????????}

????????????????
return;
????????????}

????????????
foreach?(TSource?obj?in?collection)
????????????{
????????????????
if?(predicate(obj))
????????????????{
????????????????????action(obj);
????????????????}
????????????}
????????}

???有了ForSpecification的實現,我們就可以在其基礎上實現ForEach和ForFirstSpecification:
???????#region?ForEach
????????
///?<summary>
????????
///?ForEach??對集合中的每個元素執行action。
????????
///?</summary>????????
????????public?static?void?ForEach<TSource>(IEnumerable<TSource>?collection,?Action<TSource>?action)
????????{
????????????GenericHepler.ForSpecification
<TSource>(collection,?action,?null);
????????}
????????
#endregion

????????
#region?ForFirstSpecification
????????
///?<summary>
????????
///?ForSpecification?對集合中第一個滿足predicate條件的元素執行action。如果沒有條件,predicate傳入null。
????????
///?</summary>???????
????????public?static?void?ForFirstSpecification<TSource>(IEnumerable<TSource>?collection,?Action<TSource>?action,?Predicate<TSource>?predicate)
????????{
????????????
if?(predicate?==?null)
????????????{
????????????????
foreach?(TSource?obj?in?collection)
????????????????{
????????????????????action(obj);
????????????????????
break;
????????????????}
????????????}
????????????
else
????????????{
????????????????
foreach?(TSource?obj?in?collection)
????????????????{
????????????????????
if?(predicate(obj))
????????????????????{
????????????????????????action(obj);
????????????????????????
break;
????????????????????}
????????????????}
????????????}
????????}
????????
#endregion
???有了ForSpecification,我們就可以實現查詢方法Where:
???????#region?Where
????????
///?<summary>
????????
///?Where?從集合中選取符合條件的元素
????????
///?</summary>???????
????????public?static?IList<TSource>?Where<TSource>(IEnumerable<TSource>?source,?Predicate<TSource>?predicate)
????????{www.elivn.com
????????????IList
<TSource>?list?=?new?List<TSource>();
????????????GenericHepler.ForSpecification(source,?
delegate(TSource?ele)?{?list.Add(ele);?}?,?predicate);
????????????
return?list;
????????}?
????????
#endregion ???對于C#3.0中的Select方法,其實現需要匿名類型的支持,而C#2.0中不支持匿名類型,所以,我用泛型來代替。我使用ConvertSpecification來模擬Select實現:
???????#region?ConvertSpecification
????????
///?<summary>
????????
///?ConvertSpecification?將source中的符合predicate條件元素轉換為TResult類型
????????
///?</summary>???????
????????public?static?IList<TResult>?ConvertSpecification<TSource,?TResult>(IEnumerable<TSource>?source,?Func<TSource,?TResult>?converter,?Predicate<TSource>?predicate)
????????{
????????????IList
<TResult>?list?=?new?List<TResult>();
????????????GenericHepler.ForSpecification
<TSource>(source,?delegate(TSource?ele)?{?list.Add(converter(ele));?}?,predicate);
????????????
return?list;
????????}
????????
#endregion ???converter委托用于從TSource類型對象構造TResult類型的對象。
???有了ConvertSpecification實現,我們就可以在其上繼續實現ConvertAll和ConvertFirstSpecification:
???????#region?ConvertAll
????????
///?<summary>
????????
///?ConvertAll?將source中的每個元素轉換為TResult類型
????????
///?</summary>???????
????????public?static?IList<TResult>?ConvertAll<TSource,?TResult>(IEnumerable<TSource>?source,?Func<TSource,?TResult>?converter)
????????{
????????????
return?GenericHepler.ConvertSpecification<TSource,?TResult>(source,?converter,?null);
????????}
????????
#endregion

????????
#region?ConvertFirstSpecification
????????
///?<summary>
????????
///?ConvertSpecification?將source中的符合predicate條件的第一個元素轉換為TResult類型
????????
///?</summary>???????
????????public?static?TResult?ConvertFirstSpecification<TSource,?TResult>(IEnumerable<TSource>?source,?Func<TSource,?TResult>?converter,?Predicate<TSource>?predicate)
????????{
????????????TSource?target?
=?GenericHepler.GetFirstSpecification<TSource>(source,?predicate);

????????????
if?(target?==?null)
????????????{
????????????????
return?default(TResult);
????????????}

????????????
return?converter(target);
????????}
????????
#endregion??????? ???有了上面的基礎,我們還可以實現ContainsSpecification方法:
???????#region?ContainsSpecification
????????
///?<summary>
????????
///?ContainsSpecification?集合中是否包含滿足predicate條件的元素。
????????
///?</summary>???????
????????public?static?bool?ContainsSpecification<TSource>(IEnumerable<TSource>?source,?Predicate<TSource>?predicate,?out?TSource?specification)
????????{
????????????specification?
=?default(TSource);
????????????
foreach?(TSource?element?in?source)
????????????{
????????????????
if?(predicate(element))
????????????????{
????????????????????specification?
=?element;
????????????????????
return?true;
????????????????}
????????????}

????????????
return?false;
????????}
????????
#endregion????????

????????
#region?ContainsSpecification
????????
///?<summary>
????????
///?ContainsSpecification?集合中是否包含滿足predicate條件的元素。
????????
///?</summary>???????
????????public?static?bool?ContainsSpecification<TSource>(IEnumerable<TSource>?source,?Predicate<TSource>?predicate)
????????{
????????????TSource?specification;
????????????
return?GenericHepler.ContainsSpecification<TSource>(source,?predicate,?out?specification);
????????}?
????????
#endregion???????


???代碼中的注釋已經將各個方法的用途說得非常清楚,下面我們舉兩個例子來看看如何使用它們以發揮它們的威力!
???例子一:比如,我們要從當前玩家(IPlayer)列表中找出所有年齡大于30歲的玩家的ID,通常這樣做:

??????? public?IList<string>?GetOldPlayer()
????????{
????????????IList
<string>?results?=?new?List<string>();
????????????
foreach?(IPlayer?player?in?this.playerList)
????????????{
????????????????
if?(player.Age?>?30)
????????????????{
????????????????????results.Add(player.ID);
????????????????}
????????????}

????????????
return?results;
????????}

???如果使用上面我們封裝的API,則可以非常簡單地達到目的:

?public?IList<string>?GetOldPlayer()
?{
?????
return?GenericHepler.ConvertSpecification<IPlayer,?string>(this.playerList,?delegate(IPlayer?player)?{?return?player.ID;?}?,?delegate(IPlayer?player)?{return?player.Age?>?30?});????????????
?}

???一句搞定。
???
???例子二:我們要從當前的玩家字典(Dictionary)中取出所有ID不是指定集合中的ID的其它玩家列表。
???通常,我們可以這樣做:

??????? public?IList<IPlayer>?GetPartners(params?string[]?excludedUserIDs)
????????{
????????????IList
<IPlayer>?partnersList?=?new?List<IPlayer>();
????????????
foreach?(string?userID?in?this.dicPlayers.Keys)
????????????{
????????????????
bool?exclude?=?false;
????????????????
foreach?(string?excludedUser?in?excludedUserIDs)
????????????????{
????????????????????
if?(userID?==?excludedUser)
????????????????????{
????????????????????????exclude?
=?true;
????????????????????????
break;
????????????????????}
????????????????}

????????????????
if?(!exclude)
????????????????{
????????????????????partnersList.Add(
this.dicPlayers[userID]);
????????????????}
????????????}
????????????
return?partnersList;?
????????}

???使用上面我們封裝的API,則非常簡單:

?public?IList<IPlayer>?GetPartners(params?string[]?excludedUserIDs)
?{
?????
return?GenericHepler.Where<IPlayer>(this.dicPlayers.Values,?delegate(IPlayer?player)?{?return?!GenericHepler.ContainsSpecification<string>(excludedUserIDs,?delegate(string?id)?{?return?id?==?player.UserID;?});?});????????????????????????????
?}

???靈活地使用這些API,我們可以非常簡潔地操作集合中的元素。
???最后給出GenericHepler類的源碼下載,其中還包含了幾個未介紹的實用的API。

轉載于:https://www.cnblogs.com/seoxs/archive/2011/04/20/2021838.html

總結

以上是生活随笔為你收集整理的【C#2.0】发挥匿名委托的威力!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。