自定義型別陣列排序的兩種實現方式

2022-03-06 09:13:02 字數 2602 閱讀 5811

array類是c#中所有自定義型別陣列的抽象類。這種自定義型別陣列可以像string型別一樣進行排序。這種排序的方法c#在基礎類庫中已經實現了,並且向外提供了可用的介面。只要按照c#中提供的方法就可以方便地實現自定義陣列的排序。

方式一:

自定義類person如下,想實現先按firstname排序,再按lastname排序。如果person類的**可以修改的話,只要讓person類繼承icomparable介面或icomparable介面。該介面只提供了乙個方法compareto(t),用這個方法返回乙個int值用以說明比較物件的大小。方法內的**就是自定義的排序規則。

class

person

set

}public

string

lastname

set

}public

override

string

tostring()

}

本例的自定義規則是先按firstname排序,再按lastname排序,**如下:

class person : icomparable

set

}public

string

lastname

set

}//icomparable<>介面實現

public

intcompareto(person other)

return

result;

}public

override

string

tostring()

}

方式二:

有時已定義的類的**允許修改或根本沒有源**只有dll的時候,另一種方法就可以用了。這種方法是建立另乙個自定義的繼承icomparer介面或icomparer介面的類,用來輔助自定義類的排序。該介面只提供了方法compare(x,y)。(類似compareto(t)) 用這個方法返回乙個int值用以說明比較物件的大小。方法內的**就是自定義的排序規則。。在輔助類personcompare中排序的規則定義了兩條,一是先按lastname排序,再按firstname排序,二是先按firstname排序,再按lastname排序。並用了乙個enum列舉類來區分這兩種排序。**如下:

enum

personcomparetype

class personcompare : icomparer

//icomparer<>介面實現

public

intcompare(person x, person y)

}break

;

//先按firstname排序

case

personcomparetype.firstname:

}break

;

default

:

}return

result;}}

兩種方式的使用如下:

static

void main(string

args)

,new person ,

new person

};console.writeline(

"firstname");

//方式一 (先按firstname排序)

array.sort(ps);

foreach (person p in

ps)

", p.tostring());

}console.writeline(

"lastname");

//方式二 (先按lastname排序)

array.sort(ps, new

personcompare(personcomparetype.lastname));

foreach (person p in

ps)

", p.tostring());

}console.writeline(

"firstname");

//方式二 (先按firstname排序)

array.sort(ps, new

personcompare(personcomparetype.firstname));

foreach (person p in

ps)

", p.tostring());

}console.readkey();

}

使用array類的兩個sort方法分別與上述兩種方式相結合實現排序。方式一與只有自定義陣列本身的sort方法聯合使用。方式二與有自定義陣列和icomparer型別兩個引數的sort方法一起使用。其實自己只需要實現排序規則說明的方法。而具體用什麼方法排序是由c#基礎類庫實現的(當然我們也可以根據需求自己實現)。c#基礎類庫中用的排序方法是quicksort演算法,有機會看看源**。

結果如下:

參考:c# 高階程式設計(第7版)

spark兩種自定義排序方式

一 目標物件新增隱式轉換函式的方式實現自定義排序 object mysortelse 隱式轉換函式實現自定義排序 object customsort1 學生類 case class student name string,age int,score int 二 目標物件實現ordered特質的方式實...

spark兩種自定義排序方式

一 目標物件新增隱式轉換函式的方式實現自定義排序 object mysortelse 隱式轉換函式實現自定義排序 object customsort1 學生類 case class student name string,age int,score int 二 目標物件實現ordered特質的方式實...

Android 兩種自定義的Menu

雖然兩種方法有很多相似的地方,但是使用的方法不同,廢話不多說,帖方法了 方法一功能簡述 要實現能代替系統選單的自定義選單必須保證以下基本功能的實現 能通過menu鍵隱藏顯示選單 截獲系統menu鍵動態隱藏顯示 當獲得焦點時高亮顯示獲得焦點的選單項 實現按下選單狀態效果 能設定選單背景 能設定選單項背...