(13)C#数组和元组
如果需要使用同一类型的多个对象,数组是一种数据结构,它包含同一类型的多个元素
一、一维数组
1、数组的声明方法
int [] a;
因为数组是引用类型,引用类型有个特点是:声明变量时不会马上分配一个内存,只有在用new关键字创建实例的时候,才会分配内存。
2、创建一个数组实例
a=new int[4];
栈里的变量a引用了托管堆上的4个整型值。
如果事先不知道数组中包含多少个元素,可以使用集合。
3、初始化数组变量
int[] a=new int[4]{9,5,4,3};
右边的[]里如果写了数字,那数字必须与{}数字的个数相同。[]给出的是4个,{}里必须写入4个数据。
4、初始化数组简写
初始化一个数组时可以不写数字自由分配元素个数,或者更简单直接省略new和int[]。
int[] a = new int[] { 1, 2, 3 };
int[] a={9,5,4,3};
5、创建隐式类型的数组
var name=new [] {"tom","jack","luxi","mi"};
两个语法上的特别地方:
1、等号左边省略的[]
2、右边必须是new[]{}的形式
3、{}里的数据必须是相同类型,否则编译器不判断类型导致报错。
6、访问数组元素
提取数组元素
int b=a[2];
数组元素的下标是从0开始的,所以b的值是4.
给数组元素重新赋值
int b=6; a[2]=b;
二、多维数组
数组的维数没有限制,以二维数组举例
1、二维数组的声明
int[,] a;
2、二维数组创建实例
int [,] a=new int[4,2];
3、初始化
int [,] a= new int[4,2]{{5,6},{7,2},{9,3},{5,4}}; /*可以看做是一个4行2列的表,{5, 6}是第1行的数据,一共4行 5 6 7 2 9 3 5 4 */
4、简写
int[,] a= new int[,] { { 1,2 },{ 3,4 },{ 5,6 },{5,4} }; int[,] a = {{ 1,2 },{ 3,4 },{ 5,6 },{5,4}};
5、访问数组元素
需要用两个坐标确定一个数的位置。
提取二维数组元素
int b = a[2, 1];
一定要记住只有new的时候[]里的数字表示的是行和列,其他地方a[2,1]这里的2和1是数组下标啊,是要从0开始算的。
对数组的某个元素重新赋值
a[2,1]=5; //这么写就把第三行第二列的值3变成了5
三、交错数组
交错数组也称之为数组的数组,
1、声明
int [][] a;
2、创建实例
int[][]a=new int[3][];
这个数组里包含了3个数组,而且这3个数组的长度可以自由设置。
3、赋值
a[0]=new int[] {1,4,6,8,}; a[1]=new int[]{2,3}; a[2]=new int[]{6,6,6};
交错数组也可以包含二维的数组
例如
int[][,] a =new int[3][,]; a[0]=new int[,]{{2,9},{3,6}}; a[1] = new int[,] { { 2, 9 }, { 3, 6 }, { 8, 8 } }; a[2] = new int[,] { { 2, 9 } };
四、引用类型数组
有一个Person类
public class Person { public string a { get; set; } public string b { get; set; } public override string ToString() { return String.Format("{0} {1}",a,b); } }
声明Person数组
Person[] per = new Person[2];
引用类型的数组必须在使用前为其分配内存,否则会抛出NullReferenceException异常.
per[0] = new Person { a = "李毅", b = "周杰" }; per[1] = new Person { a = "Tom", b = "Jack" };
也可以初始化赋值
Person[] per = { new Person{ a = "李毅", b = "周杰" }, new Person{a = "Tom", b = "Jack" } };
五、遍历数组
1、用for语句遍历数组
int [] a={2,9,5,8};
for(int x=0;x<a.Length;x++)
{
int b=a[x];
Console.WitreLine("b");
}
2、foreach遍历数组
foreach和for有一样的功能也能遍历数组,
int[] a={2,9,5,8};
foreach(int x in a)
{
Console.WriteLine(x);
}
3、for和foreach的对比
.foreach最大的优点就是能够在不知道数组下标的情况下遍历整个数组,代码可以写的简练些。其他的优势就没有for了
.for很灵活不仅可以能正着遍历还能倒着遍历以及还可以跳的遍历。
.如果循环的主题需要元素的下标,则需要用for
.如果需要修改数组元素,则必须用for,foreach修改会报错。
六、Ayyay类
七、数组作为参数
八、枚举
九、IEnumerator接口
十、元组
class Program { static void Main(string[] args) { //赋值元组 var b = ("tom", 23); //调用元组 Console.WriteLine(b.Item1);//tom Console.WriteLine(b.Item2);//23 //给元组元素定义名称 var c = (name: "liu", age: 29); Console.WriteLine(c.age);//29 //虽然vs隐藏了Item1,但是还是可以用这种方式调用 Console.WriteLine(c.Item1); } //定义一个返回元组的函数 (string, int) stu() { return ("tom", 23); } }
十一、结构比较
十二、数组常用的属性方法
数组常用的属性
Length属性表示数组中元素的个数(包括多维数组的个数).
int b=a.Length; //b=8
数组常用的方法
1、