這是List<T>.Sort的委託版本實現:
1 class List<T>
2 {
3 ...
4
5 public void Sort(Comparison<T> comparison)
6 {
7 if (comparison == null)
8 {
9 ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
10 }
11 if (this._size > 0)
12 {
13 IComparer<T> comparer = new Array.FunctorComparer<T>(comparison);
14 Array.Sort<T>(this._items, 0, this._size, comparer);
15 }
16 }
17 }
這是Array.Sort的委託版本:
1 class Array
2 {
3 ...
4 public static void Sort<T>(T[] array, Comparison<T> comparison)
5 {
6 if (array == null)
7 {
8 throw new ArgumentNullException("array");
9 }
10 if (comparison == null)
11 {
12 throw new ArgumentNullException("comparison");
13 }
14 IComparer<T> comparer = new FunctorComparer<T>(comparison);
15 Sort<T>(array, comparer);
16 }
17 }
其中Array.FunctorComparer<T>的定義為:
1 internal sealed class FunctorComparer<T> : IComparer<T>
2 {
3 // Fields
4 private Comparer<T> c;
5 private Comparison<T> comparison;
6
7 // Methods
8 public FunctorComparer(Comparison<T> comparison);
9 public int Compare(T x, T y);
10 }
即Array.Sort和List<T>.Sort內部都使用了一個叫Array.FunctorComparer<T>的適配器,來將委託版本轉化為IComparer<T>版本的Sort實現。本來排序中的比較操作就是效能敏感的,C++中的std::sort甚至只因為比較運算內聯的緣故就C中的qsort更快。這裡的委託版本Sort比IComparer版本多了一層適配帶來的函數調用開銷,委託版本更慢也是情理之中。
另外在對實值型別排序時,使用IComparer<T>比IComparer快,實現IComparable<T>比IComparable快。快的原因是更少的裝箱。