C# 使用IComparer自定义List类的排序方案

List类中不带参数的Sort函数可以用来为List类中的元素排序,但如果List类中的元素类型本身不能直接进行比较(如自定义的struct和很多class),或是希望采用更加灵活的自定义比较方式,可以通过继承了IComparer接口的函数来解决。

代码示例如下:

1)声明一个类

/// <summary>
/// 人物类
/// </summary>
public class Person
{
    public string Name;
    public int Age;
    public override string ToString()
    {
        return "Name: " + Name + " Age: " + Age;
    }
}

2)声明一个继承了接口IComparer的类

/// <summary>
/// 比较人物类实例大小,实现接口IComparer
/// </summary>
public class PersonComparer : IComparer<Person>
{
    public int Compare(Person x, Person y)
    {
        if (x == null && y == null) return 0;
        if (x == null) return -1;
        if (y == null) return 1;

        //TODO:Person类实例X与Y的比较规则
        //按姓名由小到大排列,姓名相同的人年龄大的在前
        {
            int temp = string.Compare(x.Name, y.Name);
            if (temp > 0) return -1;
            else if (temp < 0) return 1;

            if (x.Age > y.Age) return 1;
            if (x.Age < y.Age) return -1;
        }

        return 0;
    }
}

3)Main函数,建立一个List,并使用刚建立的PersonComparer类中的规则对List进行排序

static void Main(string[] args)
{
    List<Person> a = new List<Person>();

    a.Add(new Person() { Name = "Tsybius", Age = 23 });
    a.Add(new Person() { Name = "Galatea", Age = 21 });
    a.Add(new Person() { Name = "Lucius", Age = 22 });
    a.Add(new Person() { Name = "Septimus", Age = 22 });
    a.Add(new Person() { Name = "Octavius", Age = 22 });
    a.Add(new Person() { Name = "Lucius", Age = 24 });

    //输出a中全部元素
    Console.WriteLine("排序前");
    foreach (var v in a)
    {
        Console.WriteLine(v.ToString());
    }
    Console.WriteLine("-");

    //对a进行排序
    a.Sort(new PersonComparer());

    //输出a中全部元素
    Console.WriteLine("排序后");
    foreach (var v in a)
    {
        Console.WriteLine(v.ToString());
    }
    Console.WriteLine("-");

    Console.ReadLine();
}

4)程序运行示例

END

C# 使用IComparer自定义List类的排序方案,布布扣,bubuko.com

时间: 2024-10-27 08:24:33

C# 使用IComparer自定义List类的排序方案的相关文章

C#学习笔记(14)——C# 使用IComparer自定义List类的排序方案

说明(2017-7-17 21:34:59): 原文:https://my.oschina.net/Tsybius2014/blog/298702?p=1 摘要: C# 使用IComparer自定义List类的排序方案 List类中不带参数的Sort函数可以用来为List类中的元素排序,但如果List类中的元素类型本身不能直接进行比较(如自定义的struct和很多class),或是希望采用更加灵活的自定义比较方式,可以通过继承了IComparer接口的函数来解决. 代码示例如下: 1)声明一个类

对NSArray中自定义的对象进行排序

本文译自How to sort NSArray with custom objects. 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天程序则又一个Friend类,点菜程序会有一个Recipe类等.有时候我们希望在程序中显示的列表数据是按照一定顺序进行排列的,本文我们就来看看在iOS中有哪些方法可以对NSArray中的对象进行排序.下面是目录: 小引 使用NSComparator进行排序 使用NSDescriptor进行

关于MapReduce中自定义分区类(四)

MapTask类 在MapTask类中找到run函数 if(useNewApi){       runNewMapper(job, splitMetaInfo, umbilical, reporter);     } 再找到runNewMapper @SuppressWarnings("unchecked")   private<INKEY,INVALUE,OUTKEY,OUTVALUE>   void runNewMapper(final JobConf job,    

《java入门第一季》之TreeSet存储自定义对象并保证排序和唯一

上一篇用一个简单的例子,介绍了treeset集合存储的内部过程,这里再完善其存储自定义对象保证唯一. 需求:A: * 自然排序,按照年龄从小到大排序 *         B: * 成员变量值都相同即为同一个元素 自定义学生类给了出来: public class Student implements Comparable<Student> { private String name; private int age; public Student() { super(); } public St

iOS中对NSArray中自定义的对象进行排序

本文译自How to sort NSArray with custom objects. 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天程序则又一个 Friend类,点菜程序会有一个Recipe类等.有时候我们希望在程序中显示的列表数据是按照一定顺序进行排列的,本文我们就来看看在iOS中有哪些 方法可以对NSArray中的对象进行排序.下面是目录: 小引 使用NSComparator进行排序 使用NSDescriptor

iOS探索:对NSArray中自定义的对象进行排序

本文译自How to sort NSArray with custom objects. 我们开发的每个程序都会使用到一些数据,而这些数据一般被封装在一个自定义的类中.例如一个音乐程序可能会有一个Song类,聊天程序则又一个 Friend类,点菜程序会有一个Recipe类等.有时候我们希望在程序中显示的列表数据是按照一定顺序进行排列的,本文我们就来看看在iOS中有哪些 方法可以对NSArray中的对象进行排序.下面是目录: 小引 使用NSComparator进行排序 使用NSDescriptor

自定义实体类在三层架构之间传递数据

自定义实体类是专门承载业务实体数据的类,一般将方法分离出来,只包含属性和字段的定义.每个实体类对应数据库中的一个表,每个属性对应表中的一个相应的字段.使用实体类属于面向对象编程的思想,将每个表封装成对应的类. 1. 为什么使用自定义实体类 (1)使程序更加灵活.如果数据库发生了更改,只需要修改数据实体类的代码,其他层的代码修改量很小. (2)使用面向对象思想将数据库中的表抽象为类,消除了关系数据与类的差别,使程序维护和扩展更方便. (3)更有利于分层架构设计. 2. 使用自定义实体类作为三层架构

修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类

折腾几天记载一下,由于项目实际需要,从edmx生成的实体类能自动继承自定义的基类,这个基类不是从edmx文件中添加的Entityobject. 利用ADO.NET C# POCO Entity Generator With WCF Support生成的tt文件(比如model.tt)中找到 partial class partial class 修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类

C++ 运算符重载四(自定义数组类)

//自定义数组类 #include<iostream> using namespace std; //分析:能获取数组长度,添加元素,删除元素,修改元素 //要求重载[],=,==,!=运算符 class MyArray { private: int mLength; int* mSpace; public: MyArray(int length){ cout << "有参构造函数被调用了1" << endl; mLength = length; m