用Reflector查看.net是如何为我们排序的

如果有一个person的类型数组,需要排序,我们想按年龄排序

则使用如下方法 

Array.sort(list,(p1,p2)=>p1.age.CompareTo(p2.age));

以前知道,自定义排序需要让自己的类实现IComparer接口,写出自己的排序规则 

可是,传递一个委托变量进去(这里用的lamda表达式),.net是如何为我们排序的呢?

请看 Reflector

public static void Sort<T>(T[] array, Comparison<T> comparison)
{
    
if (array == null)
    {
        
throw new ArgumentNullException("array");
    }
    
if (comparison == null)
    {
        
throw new ArgumentNullException("comparison");
    }
    IComparer
<T> comparer = new FunctorComparer<T>(comparison);
    Sort
<T>(array, comparer);
}

 

 

 

我们看到这里new了一个 FunctorComparer<T>(comparison),并把我们的委托变量传递进去

那么这个类是怎么样的呢

internal sealed class FunctorComparer<T> : IComparer<T>
{
    
// Fields
    private Comparer<T> c;
    
private Comparison<T> comparison;

    
// Methods
    public FunctorComparer(Comparison<T> comparison)
    {
        
this.c = Comparer<T>.Default;
        
this.comparison = comparison;
    }

    
public int Compare(T x, T y)
    {
        
return this.comparison(x, y);
    }
}

 

 

 

原来它帮我们实现了 IComparer<T>接口,并且用我们传递的排序规则来实现Compare(T x, T y)

接着调用Sort<T>(array, comparer)这个重载

接着又调用4个参数的重载如下

[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
public static void Sort<T>(T[] array, IComparer<T> comparer)
{
    
if (array == null)
    {
        
throw new ArgumentNullException("array");
    }
    Sort
<T>(array, 0, array.Length, comparer);
}

 

 

 

 

再继续。。原来微软也喜欢用 XXhelper命名

 ArraySortHelper<T>.Default.Sort(array, index, length, comparer);

 

 

最后用快速排序算法完成。。 

 

 

 

 

posted @ 2010-01-20 01:31  小白.net  阅读(1268)  评论(1编辑  收藏  举报