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