背景:我們知道在乙個泛型實體集中要想實現按實體屬性排序是比較容易的,一般就是呼叫 list.sort方法,或者是在插入資料時就進行排序,也就是先呼叫list.binarysearch 方法,得到插入的索引位置。如果在乙個實體集中要實現多個字段之間相互變換的排序(有時按屬性1,有時按屬性2,並非同時按多個屬性排序),我們是不是可 以對這個操作進行些額外的封裝呢?這裡的排序我用list.binarysearch,大家當然也可以優勝list.sort方法。
首先:我們來看下面這個實體類,共包含兩個字段,乙個數字型別,乙個日期型別,我想要實現字 段排序間的動態變換,也就是說有時按數字排,有時按日期排序。
//////
實體類///
public
class
trainingbrief
#region
model
private
int_id;
private
datetime _trainingdate;
//////
自增長///
public
intid
get}
//////
日期///
public
datetime trainingdate
get}
#endregion
model }
第一:不做封裝的實現方式:寫兩個 comparer:intcomparer,datetimecomparer,**如下:
//////
按實體類的日期排序
///
public
class
datetimecomparer : icomparer
<
trainingbrief
>
else
}else
else}//
這種結果為公升序
//轉換成降序
switch
(result)
return
result;}}
//////
按實體類的數字排序
///
public
class
intcomparer : icomparer
<
trainingbrief
>}
其次是呼叫方式:對於日期排序
list
<
trainingbrief
>
_list
=new
list
<
trainingbrief
>
();for
(inti =
0; i
<
3; i++)
//////
使用指定的比較器在整個已排序的 list 中搜尋元素,並返回該 元素從零開始的索引。
///然後利用返回的索引把記錄插入到列表中
///
///資料列表
///要插入的內容
///排序類
private
void
searchandinsert(list
<
trainingbrief
>
list,
trainingbrief insert, datetimecomparer dc)}
如果要想實現數字排序,我們還需要另外寫乙個searchandinsert方法,因為接受的icompaer型別不同。這樣總覺的不太 oo。
第二:封裝後的做法。下面是我的改造過程:
1:構造乙個泛型介面,它實現icomparer介面。裡面沒有定義任何方法,因為 icomparer中已經包含了public int compare(t,x,t y)方法。
//////
排序的泛型介面
///
///實體類
public
inte***ce
icustomcomparer
<
t>
:icomparer
<
t>
2:日期排序的comparer
//////
按實體類的日期排序
///
public
class
datetimecomparer : icustomcomparer
<
trainingbrief
>
3:數字排序的comparer
//////
按實體類的數字排序
///
public
class
intcomparer : icustomcomparer
<
trainingbrief
>
4:客戶端呼叫:唯一的變化就是建立comparer:
icustomcomparer
<
trainingbrief
>
dc =
newdatetimecomparer();
修改searchandinsert方法的引數,讓它支援多個comparer,這樣就不會根據不同的排序方式建立乙個searchandinsert方 法了。
private
void
searchandinsert(list
<
trainingbrief
>
list,
trainingbrief insert, icustomcomparer
<
trainingbrief
>
dc)
如果覺的上面的還不夠oo,我們可以把searchandinsert方法單獨提出來,放入乙個泛型類中。
public
class
binarysearchhelp
<
t>}
優點:1)所有的例項集的屬性排序都可以利用了這個泛型介面;
2) 排序字段發生變化時非常容易控制,我們可以結合工廠模式,來動態建立具體的comparer。
篇外話:我們專案開發時,有時總感覺一些什麼演算法啊什麼的,不知道怎麼用,這篇文章,裡面就 應用了很多這方面的知識,像list.sort實現時就是採用的快速排序,呼叫list.binarysearch 時,應用了~操作符,而它正是學校學的取反操作。
愛真的很痛
不知道什麼時候開始喜歡上了他,早上他跟我說 一大早我以前的女友打 過來告訴我說,她如果考上公務員就和我在一起,沒有就不和我在一起,她說她想我和在一起,所以她現在都很努力的看書 為什麼我的心那樣的痛,他一說完這句話,我的眼淚就流了出來。他是不是值得我去選擇呢?我自己也不知道,我頭好痛,我好辛苦。他也跟...
我真的很痛苦
本人一小菜鳥,剛畢業就進了一家的小軟體公司,進去沒有多久,就被外包出去。外包出去沒有什麼,關鍵是公司和甲方說我有兩年的開發經驗。這句話真的讓我非常的受傷。一開始還好,漸漸的他們發現我這個開發有兩年的人不知道東西還不少,估計就都開始鄙視我。這點我可以很明顯的感覺到,這點讓我真的很痛苦。雖然我也告訴我自...
linux真的很安全麼?
寫這篇文章是因為看到了cnbeta上最近接二連三地出現類似這篇的文章。雖然我還是認為此文的作者多少還是有點標題黨,因為那個 a 其實可以是任何東西,這樣就說是 乙個命令 也太無聊了點。但是我在公司的rhel4的伺服器上試驗了之後,確實可以非法提公升許可權。不免有點擔憂。於是我順藤摸瓜,在那個提供ha...