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("对象类型不正确!");
		}
	}
}

  

posted on 2013-11-26 14:34  wp456  阅读(285)  评论(0)    收藏  举报

导航