C# 返回int类型的内置委托—Comparison

MSDN给出的定义:表示比较同一类型的两个对象的方法

  它的定义也很简单:

public delegate int Comparison<in T>(T x, T y)

 

  T是要比较的对象的类型,而返回值是一个有符号整数,指示 x 与 y 的相对值,如下表所示:

含义

小于 0

x 小于 y。

0

x 等于 y。

大于 0

x 大于 y。

  此委托由 Array 类的 Sort<T>(T[], Comparison<T>) 方法重载和 List<T> 类的 Sort(Comparison<T>) 方法重载使用,用于对数组或列表中的元素进行排序

4.2 深入Comparison

  由于Comparison委托常用于在集合中进行排序,那么我们就来看看如何使用Comparison委托来进行元素的排序。于是,我们将目光转到List集合的Sort方法,相信大部分童鞋也都用过这个方法。

  (1)老惯例,还是先看看Sort方法的定义:

        //
        // 摘要:
        //     使用指定的 System.Comparison<T> 对整个 System.Collections.Generic.List<T> 中的元素进行排序。
        //
        // 参数:
        //   comparison:
        //     比较元素时要使用的 System.Comparison<T>。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     comparison 为 null。
        //
        //   System.ArgumentException:
        //     在排序过程中,comparison 的实现会导致错误。 例如,将某个项与其自身进行比较时,comparison 可能不返回 0。
        public void Sort(Comparison<T> comparison);

 

  (2)再来看看Sort方法的实现:

  可以看出,这里虽然使用Comparison委托但最终还是转换成了Comparer比较器,再次调用重载的Array.Sort静态方法进行排序。

  (3)现在我们来用一下Comparison委托:还是以那个PersonList集合为例,假如我们要以Age为条件进行降序排列,我们应该怎么来写这个委托呢?

List<Person> personList = GetPersonList();

personList.Sort(delegate(Person p1, Person p2)
{
      return p2.Age - p1.Age;
});

personList.ForEach(delegate(Person p)
{
      Console.WriteLine(p.ID + "-" + p.Name + "-" + p.Age);
});

 

  实现的效果如下图所示:

  那么,如果是要进行升序排列呢?只需要改一下:return p2.Age-p1.Age; 更改一下被减数和减数的位置,即可完成升序和降序的切换。

personList.Sort(delegate(Person p1, Person p2)
{
      return p1.Age - p2.Age;
});

 

 

 

出处:http://edisonchou.cnblogs.com

posted @ 2020-05-29 11:45  delafqm  阅读(1050)  评论(0编辑  收藏  举报