Array 抽象类的使用及排序
/* Array 抽象类 在C#中使用[]创建数组其实是Array的表示法,C#会创建一个派生Array的新类,然后就能使用Array的方法和属性了。 */ using System; namespace Frank { public class Test { public static void Main(string[] args) { int[] ar = {1,2};//方括号C#的特殊语法,自动创建了一个派生自Array的类。 System.Console.WriteLine(ar.LongLength+"---"+ar.Rank+"---"+ar.GetLength(0));//使用Arry中的属性和方法 Array intArray1 = Array.CreateInstance(typeof(int),5);//创建一个数组,定义为5个空间大小 for(int i = 0; i< intArray1.GetLength(0); i++) { intArray1.SetValue(11,i);//设置值 } for(int i = 0; i <intArray1.GetLength(0);i++) { System.Console.WriteLine(intArray1.GetValue(i));//获取值 } Array ar2 = ar;//把子类型转换成父类型总是隐士的 int[] intArray2 = (int[])intArray1;//把父类型转换成子类型总是显示的。 //创建多维数组 //一个2x3列的二维数组 int[] lengths = {2,3};//每维的大小 int[] lowerBounds = {0,10};//维数的起始0索引和每维元素的起始10索引 Array racers = Array.CreateInstance(typeof(int[]),lengths,lowerBounds); racers.SetValue(new int[]{1,2,3},0,10); racers.SetValue(new int[]{4,5,6},0,11); racers.SetValue(new int[]{7,8,9},0,12); racers.SetValue(new int[]{10,11,12},1,10); racers.SetValue(new int[]{13,14,15},1,11); racers.SetValue(new int[]{16,17,18},1,12); //遍历多维数组 for(int i = 0; i < racers.GetLength(0);i++)//第一维 { for(int j =0;j < racers.GetLength(1);j++)//第二维 { for(int k = 0; k < ((int[])racers.GetValue(i,j+10)).Length;k++)//访问里面的数组元素个数 { System.Console.Write(((int[])racers.GetValue(i,j+10))[k]+" "); } } } System.Console.Write("\n"); //克隆数组(浅表版本) //如果数组里面的值是值类型,那么就会复制两份,如果是引用类型的那么就是复制两份引用类型值,操作其中一个引用对象的值都会影响另外一个对象的值。 int[] intArrays1 = {1,2}; int[] intArrays2 = (int[])intArrays1.Clone(); //排序 //必须实现接口IComparable,string类型和Int32类型它们都实现了,所以能自动排序 string[] names = {"A","C","B"}; Array.Sort(names); foreach(string item in names) { System.Console.Write(item+" "); } System.Console.Write("\n"); /* 输出结果:A B C */ //自定义类排序 Array test2 = Array.CreateInstance(typeof(Test2),2); test2.SetValue(new Test2{Count = 1,Age=10},0); test2.SetValue(new Test2{Count = 1,Age=20},1); Array.Sort(test2);//进行排序 for(int i = 0;i<test2.GetLength(0);i++) { System.Console.Write(((Test2)test2.GetValue(i)).Age+" "); } } } public class Test2 : IComparable//自定义类,必须实现接口IComparable { public int Count { get; set; } public int Age{get;set;} public int CompareTo(object value) //降序 { if(value == null) { throw new ArgumentNullException("对象不能为空!"); } if(value.GetType() == typeof(Test2)) { Test2 t = (Test2)value; System.Console.WriteLine(t.Count+"--"+this.Count); if(this.Count > t.Count) { return 1;//当前实例排在value实例后面 } else if(t.Count == this.Count) { return 0;//相等,当前实例排在对比实例的后面 } else { return -1;//当前实例排在value实例前面 } } throw new ArgumentNullException("对象类型不正确!"); } } }