開發故事 第三回,實現集合類Sort自定義排序

2022-02-01 14:37:56 字數 3220 閱讀 8076

《你必須知道的.net》**

|anytao技術部落格

anytao

anytao.com

,anytao原創作品,轉貼請註明作者和出處。

對集合元素進行排序是經常發生的事情,事實上大部分的集合型別都預設實現了sort方法,進行其元素的排序操作。例如list集合的sort方法有:

public void sort();

public void sort(comparison

comparison);

public void sort(icomparer

comparer);

public void sort(int index, int count, icomparer

comparer);

在排序使用上,四個sort是大同小異,唯一不同的是大部分情況下,排序的要求決定了我們不能完全滿足於預設排序的情況,因為framework根本不清楚「你」排序的目的,例如:

bookstore bs = new 

bookstore

, new

book,

new

book }};

如果需要對書店的書目進行排序,那麼在我們的小示例中至少可以按照書名、書價和出版日期進行排序,因此.net framework在設計上為sort提供了很好的擴充套件,通常情況下我們需要實現自定義的comparison和comparer,例如:

// release : code01, 2009/04/12                    

// author : anytao,

// list : protram.cs

//02 sort by custom comparison

bs.books.sort((a, b) => );

foreach (var item in bs.books)

:, ", item.name, item.price, item.publishdate.tostring()));

}

你看利用lambda表示式實現乙個custom comparison是何其簡單:

bs.books.sort((a, b) => );
輸出的結果為:

如果我們實現以出版日期進行排序的custom comparison,應該是這樣:

bs.books.sort((a, b) => );
排序的結果如我所願:

利用lamdba表示式實現的comparison變得非常簡單,優雅有度,我們回歸複雜將lamdba表示式解析為匿名方法(anonymous method):

// release : code01, 2009/04/12                    

// author : anytao,

// list : protram.cs

//03 sort by custom comparison: anonymous method

bs.books.sort(delegate(book a, book b)

);

如果你對匿名方法還心存芥蒂,那麼我們回歸custom comparison的最本源實現:

// release : code01, 2009/04/12                    

// author : anytao,

// list : bookcomparison.cs

public class

bookcomparison : icomparer

}

利用bookcomparison 進行比較,

//04 sort by custom comparison: bookcomparison

bs.books.sort(new

bookcomparison().compare);

輸出的結果和bs.books.sort((a, b) => );一樣,可謂皆大歡喜。

// release : code01, 2009/04/12                    

// author : anytao,

// list : bookcomparison.cs

public class

bookcomparison : icomparer

public int compare(book x, book y)

return 0;}}

新增乙個comparisontype結構,在bookcomparson初始化時決定comparison的方式:

//04 sort by custom comparison: bookcomparison

bs.books.sort(new

bookcomparison(comparisontype.publishdate).compare);

自定義comparison為實現更好的sort控制,提供了很好的擴充套件機制。在我們的實際應用中,對於例如bookstore這樣的具體應用而言,我更推薦以linq的orderby來實現,例如:

//05 sort by linq

var list = from c in bs.books

orderby c.publishdate ascending

select c;

foreach (var item in list)

:, ", item.name, item.price, item.publishdate.tostring()));

}

orderby子句可以選擇任意的排序條件,同時ascending或者descending控制公升序和降序。

何去何從,看官自評。

2009/04/12 | |

本文以「現狀」提供且沒有任何擔保,同時也沒有授予任何權利。 | this posting is provided "as is" with no warranties, and confers no rights.

IT餐館 第三回 模式

就在上回聚會後不久,杜鵬就在 msn上聯絡雨辰,說他們公司最近新招來了兩個新人,其中乙個小伙對設計模式很感興趣,沒事就找老杜聊怎麼學這個東西,老杜想起雨辰前些 年總愛在酒桌上與大家聊這些話題,所以就想單獨約雨辰出來給那個小伙講講。雨辰因為最近產品要發布測試版有些忙,所以就約在三天後的週六中午在王利的...

第三回 實數域

上回已經構造了實數系 mathbb r sim.下面在 mathbb 上定義一些運算使之構成乙個域.mathbb 中的元素由有理數基本列的等價類 a n 構成,為了記號的方便,我們今後就用 a n 來表示.仿照有理數域,我們希望定義加減乘除.其中加法和減法比較好定義 a n b n a n b n ...

第三回 Controller與View

這節我們讓asp.net mvc真正的跑起來 首先我們自己新建乙個新的controller在controllers上點右鍵,新增,controller選項 之後出現乙個對話方塊 這裡我們將之起名為eicecontroller 附註一下,這裡是個純廣告,無興趣可略過此行 www.eice.com.cn...