第五章:数组/Array/Tuple/yield

数组

如果需要使用同一类型的多个对象,就可以考虑使用集合和数组.如果需要使用不同类型的多个对象,可以考虑使用Tuple(元组)

数组的声明

在声明数组时,应先定义数组元素中的类型,其后是一对空方括号和变量名

int[] myAyyay;

 数组初始化

声明了数组之后,就必须为数组分配内存,以保存数组的元素,数组是引用类型,所以必须给它分配堆上的类型,为此,需要使用new运算符,指定数组元素的数据类型和数量来初始化数组

myArray=new int[10];

在指定了数组大小后,如果不复制数组中的所有元素,就不能重新设置数组大小,如果事先不知道数组应包含多少元素,就应该使用集合

可以在数组声明时,同时初始化数组

int[] myArray= new int[10];

使用数组初始化器在声明数组变量时为数组赋值

int[] myArray= new int[4]{1,2,4,5};

此时还可不指定数组大小

int[] myArray= new int[]{1,2,4,5};

更简化的方式

int[] myArray={1,2,5,4};

访问数组元素

扫描二维码关注公众号,回复: 5699565 查看本文章

在声明和初始化数组后,就可以通过索引器来访问其中的元素,数组只支持有整型参数的索引器,并索引总是从0开始;如果使用超出数组长度的索引器来访问数组元素,就会造成数组越界

int value= myArray[2];

定义自定义类型数组;如果数组中的元素是引用类型,就必须为每个数组元素分配内存

class Program
    {
        static void Main(string[] args)
        {
            int[] intArray = { 1, 2, 5, 4 };
            string[] stringArray = { "", "", "" };

            Person[] persons =  {
                new Person { Name = "w", Age = 1 },
                new Person { Name = "l", Age = 2 }
            };
            Console.WriteLine(intArray[2]);
            Console.WriteLine(stringArray[2]);
            Console.WriteLine(persons[0].Age);
            Console.ReadKey();
        }
    }
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public override string ToString()
        {
            return string.Format("{0},{1}", Name, Age);
        }
}

多维数组

一维数组使用一个整数来索引.多维数组使用两个或多个整数来索引

            //事先不知道元素的值
            int[,] array = new int[2, 2];
            array[0, 0] = 1;
            array[0, 1] = 1;
            array[0, 2] = 1;
            array[1, 0] = 1;
            array[1, 1] = 1;

            //事先知道元素的值
            int[,] array1 = {
                { 1,2,},
                { 4,5,},
            };
            //使用两个","声明三维数组
            int[,,] array3 = {
                { { 1,2},{ 3,4} },
                { { 5,6},{ 7,8} },
            };

 注意:声明数组后,就不能修改阶数了

锯齿数组

在锯齿数组中,每一行都可以有不同的大小

int[][] jagged= new int[3][];
jagged[0]= new int[2]{1,2};
jagged[1]= new int[3]{7,8,9};

 Array

用方括号声明数组是C#使用Array累的表示法,Array类是一个抽象类,所以不能使用构造函数来创建数组,但是除了可以使用C#语法创建数组外,还可以使用静态方法CreateInstance()创建数组;如果实现不知道元素类型,该静态方法非常有用

            Array array = Array.CreateInstance(typeof(int), 3);
            for (int i = 0; i < array.Length; i++)
            {
                array.SetValue(1, i);
            }
            for (int i = 0; i < array.Length; i++)
            {
                Console.WriteLine(array.GetValue(i));
            }
            foreach (var item in array)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();

复制数组

因为数组是应用类型,所以将一个数组变量赋予另一个数组变量,就会得到两个引用同以数组的变量,而复制数组,会使数组实现ICloneeable接口,这个接口定义的Clone方法会创建数据的浅表副本

   class Program
    {
        static void Main(string[] args)
        {
            //***********值类型*****************
            int[] array = { 1, 2, 3 };

            int[] array2 = (int[])array.Clone();
            array2[1] = 6;

            foreach (var item in array)
            {
                Console.WriteLine("array:{0}", item);
            }
            foreach (var item in array2)
            {
                Console.WriteLine("array2:{0}", item);
            }
            //***********引用类型*****************
            Person[] persons = {
                new Person{ Name="w"},
                new Person{ Name="l"}
            };
            Person[] persons2 = (Person[])persons.Clone();
            persons2[0].Name = "哈哈";
            foreach (var item in persons)
            {
                Console.WriteLine("persons:{0}", item.Name);
            }
            foreach (var item in persons2)
            {
                Console.WriteLine("persons2:{0}", item.Name);
            }
            Console.ReadKey();
        }
    }

    class Person
    {
        public string Name { get; set; }
    }

因为array是值类型,改变array2元素的值,并不会影响array自身;persons是引用类型所以,对persons2的改变会影响persons的值

除了使用Clone方法外,也可以使用Array.Copy()方法来创建浅表副本,区别在于:Clone()方法会创建一个新数组,而Copy()方法必须传递阶数相同且有足够元素的已有数组

ArraySegment<T>

结构ArraySegment<T>表示数组中的一段.如果需要使用不同的方法处理数组的不同部分,如果按照正常方式处理,可以通过将数组部分复制到各个方法中,但是这么做会在不同的方法中都创建新的数组,更有效的方法是使用同一个数组.在不同的方法中使用数组的不同部分;数组段不复制原数组的元素,但原数组可以通过ArraySegment<T>访问,如果数组中元素改变了,变化会映射到原数组中

猜你喜欢

转载自www.cnblogs.com/GnailGnepGnaw/p/10618666.html