前言

在C#中List<>是一个很好用的容器,采用泛型避免了ArrayList中经常出现的拆箱装箱,List<>中还提供了很多操作数据集合的方法。我们往往要对集合中的数据进行排序操作,下面简单介绍几种方法。


一、Sort()方法

直接使用成员方法Sort()只能对C#本身的几种类型进行排序,比如int,float,double等,不能对我们自定义的类型进行排序。

//申明一个List容器
List<int> list = new List<int>();
//向list中添加数据
list.Add(4);
list.Add(2);
list.Add(3);
//排序
list.Sort();

此时输出list将是升序排列后结果,即:2 3 4 。

二、对自定义类型进行排序

首先声明一个自定义类型

class Item
{
    public int money;
    public Item(int money)
    {
    	this.money = money;
    }
}

申明一个自定义类型的List

List<Item> itemList = new List<Item>();
itemList.Add(new Item(100));
itemList.Add(new Item(300));
itemList.Add(new Item(200));

这时候要是在Main中使用itemList.Sort()程序运行时会报错的,下面介绍几种解决方法实现对自定义类型的排序。

1.继承接口IComparable<>

进入int等可以用Sort()进行排序的几种类型查看定义会发现,它们都继承了接口IComparable<>,实现其中的CompareTo()方法从而实现排序,因此我们也可以套在自定义类型上。

代码如下:

class Item : IComparable<Item>
{
    public int money;
    public int CompareTo(Item other)
    {
        //返回值含义:
        //小于0:放在传入对象的前面
        //等于0:保持当前的位置不变
        //大于0:放在传入对象的后面

        if (this.money > other.money) return 1;
        else return -1;
    }
}

这样,调用itemList.Sort()就不会报错,并且排好序了。
注意,其实还有一个不带泛型的接口IComparable也可以实现,进去看过后会发现它的CompareTo()方法参数为object类型,就要多一步转换:

(other as Item).money

2.通过委托方法进行排序

进入到Sort()方法定义去看,其实是有四种重载的,其中有一种重载参数是一个返回值为int类型的委托类型,我们可以在外面声明一个用来排序的方法。

代码如下:

static int SortItem(Item item1,Item item2)
{
     //传入的对象为列表中的对象
     //进行两两比较,用左边的和右边的 按条件 比较
     //返回值规则与接口方法相同
     if (item1.money > item2.money) return 1;
     else return -1;
}

将方法名作为参数传递,实现排序。

itemList.Sort(SortItem);

3.通过匿名函数、Lambda表达式排序

这种方法和第二种方法原理相同,熟悉委托的读者都知道,匿名函数和Lambda表达式可以说与委托的使用是相辅相成的,这里用一种较为简洁的方式实现排序方法:

itemList.Sort((item1, item2) => { return item1.money > item2.money ? 1 : -1; });

如此一来,一行代码就可实现对List容器中的自定义类型进行排序。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐