近日,在工作的時候遇到要對乙個大的list集合進行排序,於是就了解下各種list的排序方法。
首先,排序自然就會想到用sort方法,看看list的sort方法各個過載版本:
publicvoid
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排序。類的定義如下:
publicclass article : icomparable
public
int comments
public
int sortindex
public
override
string
tostring()
public
intcompareto(article other)
}
定義乙個獲取100萬的article集合的方法,article的sortindex,comments都是隨機生成的。實現**如下:
privatestatic listgetarticlelist()
;source.add(article);
}return
source;
}
執行sort方法排序:
privatestatic
void
sortbydefaultcomparer()
2:使用comparison委託
comparison委託的定義如下:public delegate int comparison(t x, t y);
使用委託,可以傳遞乙個與委託簽名相同的函式,可以使用匿名委託,還可以用lambda表示式:
首先使用第一種方法:定義乙個articlecomparison類,在裡面定義乙個compare方法,函式簽名與comparison委託保持一致。實現**如下:
publicclass
articlecomparison
else
else}}
}//方法呼叫
private
static
void
sortbycomparison()
接下來,使用lambda表示式,實現**如下:
privatestatic
void
sortbylambda()
);}
3:使用自定義的icomparer來排序,這裡自定義乙個articlecompare類:實現**如下:
publicclass 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排序,實現**如下:
privatestatic
void
sortbylinq()
6:使用擴充套件方法orderby,orderbydescending,實現**如下:
privatestatic
void
sortbyextensionmethod()
疑惑:讓我覺得奇怪的是,用擴充套件方法,排序的效率竟然會快的驚人。我看了擴充套件方法的實現如下:
publicstatic iorderedenumerableorderby(this ienumerablesource, funckeyselector)
返回的是乙個新的orderedenumerable物件,orderedenumerable<>的構造方法如下:
orderedenumerable(ienumerablesource, funckeyselector, icomparercomparer, bool descending);
看了實現**,從常理來說是不可能快過array.sort方法。只能留下疑惑。希望高人解答!
此外,還有其他的排序方法,也請告知!
List的各種排序方法
近日,在工作的時候遇到要對乙個大的list集合進行排序,於是就了解下各種list的排序方法。首先,排序自然就會想到用sort方法,看看list的sort方法各個過載版本 public void sort public void sort comparisoncomparison public voi...
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...