List的各種排序方法

2021-07-24 17:53:44 字數 2766 閱讀 1125

近日,在工作的時候遇到要對乙個大的list集合進行排序,於是就了解下各種list的排序方法。

首先,排序自然就會想到用sort方法,看看list的sort方法各個過載版本:

public

void

sort();

public

void sort(comparisoncomparison);

public

void sort(icomparercomparer);

public

void sort(int index, int count, icomparercomparer);

1:sort()方法,摘要:使用預設比較器對整個 system.collections.generic.list中的元素進行排序,這裡的預設比較器就是指comparer.default。要使用預設比較器來排序,則類必須實現icomparable介面,排序的時候會呼叫介面的compareto方法。

接下來,就定義乙個測試類article,實現icomparable介面,排序先按sortindex排序,再按comments排序。類的定義如下:

public

class article : icomparable

public

int comments

public

int sortindex

public

override

string

tostring()

public

intcompareto(article other)

}

定義乙個獲取100萬的article集合的方法,article的sortindex,comments都是隨機生成的。實現**如下:

private

static listgetarticlelist()

;source.add(article);

}return

source;

}

執行sort方法排序:

private

static

void

sortbydefaultcomparer()

2:使用comparison委託

comparison委託的定義如下:public delegate int comparison(t x, t y);

使用委託,可以傳遞乙個與委託簽名相同的函式,可以使用匿名委託,還可以用lambda表示式:

首先使用第一種方法:定義乙個articlecomparison類,在裡面定義乙個compare方法,函式簽名與comparison委託保持一致。實現**如下:

public

class

articlecomparison

else

else}}

}//方法呼叫

private

static

void

sortbycomparison()

接下來,使用lambda表示式,實現**如下:

private

static

void

sortbylambda());}

3:使用自定義的icomparer來排序,這裡自定義乙個articlecompare類:實現**如下:

public

class articlecompare : icomparer

else

else}}

}//方法呼叫

private

static

void

sortbycustomercomparer()

4:最後乙個函式過載,就是指定對那些元素進行排序。

小結:sort方法的各個過載版本,最終呼叫的都是array.sort(t array, int index, int length, icomparercomparer)方法。

使用comparison委託的時候,會執行icomparercomparer = new array.functorcomparer(comparison),最終轉換為icomparer,因此在效能上會打點折扣。

5:使用linq排序,實現**如下:

private

static

void

sortbylinq()

6:使用擴充套件方法orderby,orderbydescending,實現**如下:

private

static

void

sortbyextensionmethod()

疑惑:讓我覺得奇怪的是,用擴充套件方法,排序的效率竟然會快的驚人。我看了擴充套件方法的實現如下:

public

static iorderedenumerableorderby(this ienumerablesource, funckeyselector)

返回的是乙個新的orderedenumerable物件,orderedenumerable<>的構造方法如下:

orderedenumerable(ienumerablesource, funckeyselector, icomparercomparer, bool descending);
看了實現**,從常理來說是不可能快過array.sort方法。只能留下疑惑。希望高人解答!

此外,還有其他的排序方法,也請告知!

分類: 

c#標籤: 

c# 編碼

List的各種排序方法

近日,在工作的時候遇到要對乙個大的list集合進行排序,於是就了解下各種list的排序方法。首先,排序自然就會想到用sort方法,看看list的sort方法各個過載版本 public void sort public void sort comparisoncomparison public voi...

List的各種排序方法

list的各種排序方法 近日,在工作的時候遇到要對乙個大的list集合進行排序,於是就了解下各種list的排序方法。首先,排序自然就會想到用sort方法,看看list的sort方法各個過載版本 public void sort public void sort comparisoncompariso...

List的各種排序方法

近日,在工作的時候遇到要對乙個大的list集合進行排序,於是就了解下各種list的排序方法。首先,排序自然就會想到用sort方法,看看list的sort方法各個過載版本 public void sort public void sort comparisoncomparison public voi...