第五章:数组/Array/Tuple/yield
Posted gnailgnepgnaw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第五章:数组/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};
访问数组元素
在声明和初始化数组后,就可以通过索引器来访问其中的元素,数组只支持有整型参数的索引器,并索引总是从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>访问,如果数组中元素改变了,变化会映射到原数组中
以上是关于第五章:数组/Array/Tuple/yield的主要内容,如果未能解决你的问题,请参考以下文章