• C#


    Array类简介

    Array类是C#中所有数组的基类。我们常用的[]声明数组即为Array类的语法,我们可通过Array类提供的各种方法对C#中数组进行操作。最典型的就是数组排序

    Array.Sort 解析

    比较原理:

    Array类型的比较方法,由IComparable接口和其中的CompareTo方法实现

    • IComparable 接口:定义由值类型或类实现的特定于类型的通用比较方法,旨在对其实例进行排序
    • CompareTo(Object)指示当前实例在排序顺序中的位置是在同一类型的第二个对象之前、之后还是与其相同。它由非泛型集合对象的方法自动调用,如Array.Sort(), 用于对数组中的每个成员进行排序。 如果自定义类或结构未实现IComparable,则无法对其成员进行排序,并且排序操作可以InvalidOperationException引发

    普通数组类型:

    由于数组如Int32已经继承了IComparable, IComparable等接口(注:int是Int32结构体);string继承了IComparable, IComparable等接口(注:string是String类)。
    因此我们无需对测试类继承上述接口、定义比较方法等,可直接使用其比较方法进行排序


    //待排数组
    int[] arr = { 9, 4, 5, 3, 3, 2, 2, 1, 0, -1 };
    string[] str = { "张三", "李四", "王五" };
    
    //默认情况
    Array.Sort(arr);	//-1 0 1 2 2 3 3 4 5 9
    Array.Sort(str);	//李四 王五 张三
    
    
    //Lambda 隐式return方法:
    Array.Sort(arr, (p1, p2) => p1.CompareTo(p2));	//-1 0 1 2 2 3 3 4 5 9
    Array.Sort(arr, (p1, p2) => p2.CompareTo(p1));	//9 5 4 3 3 2 2 1 0 -1
    Array.Sort(str, (p1, p2) => p1.CompareTo(p2));	//李四 王五 张三
    Array.Sort(str, (p1, p2) => p2.CompareTo(p1));	//张三 王五 李四
    
    //Lambda 显示return方法:
    Array.Sort(arr, (p1, p2) =>
    {
        if (p1 > p2)
            return 1;
        else if (p1 < p2)
            return -1;
        else
            return 0;
    });	//-1 0 1 2 2 3 3 4 5 9
    

    自定义类型:

    由于我们自定义的类型(单、多个待比较参数)未自动继承IComparable等接口,因此想要对该类的实例进行特殊规则排序时,需要自行继承、并实现比较方法

    //自定义待排数据类
    class Person : IComparable
    {
    	//属性:姓名、性别
        public string Name { get; set; }
        public string Sex { get; set; }
    
    	//构造函数初始化
        public Person(string name, string sex)
        {
            Name = name;
            Sex = sex;
        }
    
    	//重写打印格式
        public override string ToString()
        {
            return Name + " " + Sex;
        }
    
    	//实现Person类比较方法:优先姓名升序,同名则性别升序
        public int CompareTo(object obj)
        {
            Person p = obj as Person;
            if (!Name.Equals(p.Name))
                return Name.CompareTo(p.Name);
            else
                return Sex.CompareTo(p.Sex);
        }
    }
    
    //测试类
    class Test
    {
    	static void Main()
    	{
    		//创建自定义类型待排数组persons
            Person[] persons =
            {
                new Person("张三", "Female"),
                new Person("李四", "Male"),
                new Person("王五", "Female"),
                new Person("王五", "Male")
            };
    
    		//自动使用Person类中的CompareTo比较方法
            Array.Sort(persons);
            foreach (Person p in persons)
                Console.WriteLine(p);
    		/*
    		李四 Male
    		王五 Female
    		王五 Male
    		张三 Female
    		*/
    	}
    }
    

    Array其他属性及方法

    推荐佳作:

    参考

  • 相关阅读:
    【原】React操作表单
    【原】使用webpack打包的后,公共请求路径的配置问题
    【原】React中,map出来的元素添加事件无法使用
    codeforces 1288C. Two Arrays(dp)
    Educational Codeforces Round 80 A-E简要题解
    HDU 2586 ( LCA/tarjan算法模板)
    POJ 1330(LCA/倍增法模板)
    POJ 3368 (ST表)
    POJ 3264 Balanced Lineup(ST模板)
    codeforces 1285E. Delete a Segment
  • 原文地址:https://www.cnblogs.com/SouthBegonia/p/11930595.html
Copyright © 2020-2023  润新知