数组

如果需要使用同一类型的多个对象,就可以使用数组.数组是一种数据结构,他可以包含同一类型的多个元素.

数组的声明

在声明数组时,应先定义数组中元素的类型,其后是一对方括号核一遍变量名.例如:生命一个包含整型元素的数组:

int [] array;

数组的初始化

声明了数组后就必须为数组分配内存,以保存数组的所有元素.数组是引用类型,所以必须给它分配堆上的内存.为此,应使用new运算符,制定数组中元素的类型和数量来初始化数组的变量.下面制定了数组的大小.

array=new int[4];

在声明和初始化完数组后,变量array就引用了4个整型值,它们位于托管堆上:

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

声明和初始化的简化操作:
int [] array=new int[4];

还可以使用数组初始化器维数组的每个元素赋值.数组初始化器只能在声明数组变量时使用,不能在声明数组之后使用.

int [] array =new int [4] {1,2,3,4};

如果用花括号吃书画数组,则还可以不指定数组的大小,因为编译器会自动识别统计元素的个数:

int [] array =new int []{1,2,3,4};

更简单的办法:

int [] array ={1,2,3,4};

访问数组元素

在声明和初始化数组后,就可以使用索引器访问其中的元素了.数组只支持有整型参数的索引器.

通过所以其传递元素编号,就可以访问数组.索引器总是以0开头.表示第一个元素.可以传递给索引器的最大值是元素的个数减一,因为索引器从0开始.

int [] array=new int[] {1,2,3,4};

int v1=array[0];

int v2=array[1];

array[3]=44;

Console.WriteLine(arrar[4])//这里会出错.

如果使用错误的索引器值(其中不存在对应的元素),就会抛出IndexOutOfRangeException异常.

如果不知道数组中的元素个数,可以在for语句中使用Length属性:

for ( int i=0;i<array.Length;++i)

{

Console.WriteLine(arrray[i])

}

除了使用for语句之外也可以使用foreach语句:
foreach(var item in array)

{

Console.WriteLine(item);

}

使用引用类型

除了能声明预定义的数组,还可以声明自定义的数组.

public class Person

{

public string FirstName { get; set; }

public string LastName { get; set; }

public override string ToString()

{

return string.Format("{0},{1}", FirstName, LastName); ;

}

}

生命一个包含两个Person元素的数组与生命一个int数组类似:

Person[] p = new Person[2];

注意:如果数组中的元素是引用类型,就必须为每个数组元素分配内存.若使用了数组中未分配内存的元素,就会抛出NullReferenceException类型的异常.

使用从0开始的索引器,可以为数组的每个元素分配内存.:

p[0] = new Person { FirstName = "hahaha", LastName = "heiheihei" };

p[1] = new Person { FirstName = "hehehe", LastName = "gagaga" };

该图显示了Person数组中的对象在托管堆中的情况.myPerson是存储在栈上的一个变量,该变量引用了存储在托管堆上的Person元素对应的额数组.这个数组有足够容乃两个引用的空间.数组中的每一项都引用了一个Person对象,而这些Person对象也存储在托管堆上.

和int类型一样,也可以对自定义类型使用数组初始化器:

Person [] p=

{

new Person { FirstName = "hehehe", LastName = "gagaga" };

new Person { FirstName = "hahaha", LastName = "heiheihei" };

}

多维数组

一般数组(也称为一位数组)用一个整数来索引.多维数组用两个或多个整数来索引.

在C#中声明二维数组,需要在方括号中加上一个逗号.数组在初始化时应制定每一维的大小(也称为阶).接着,就可以使用两个整数作为索引器来访问数组中的元素:

int[,]array=new int [1,1];

array[0, 0] = 1;

array[0, 1] = 2;

array[1, 0] = 3;

array[1, 1] = 4;

声明数组之后,就不能修改其阶数了.

如果事先知道元素的值,则可以使用数组索引器来初始化二维数组.在初始化数组时,使用一个外层的花括号,每一行用包含在外层花括号中的内层花括号来初始化.

int[,] array = {

{1,2,3},

{4,5,6},

{7,8,9}

};

使用数组初始化器时,必须初始化数组的每个元素,不能泄露任何元素.

在花括号中使用两个逗号,就可以生命一个三维数组:

int[, ,] array ={

{{1,2},{3,4}},

{{5,6},{7,8}},

{{9,10},{11,12}}

};

Console.WriteLine(array[0,1,1]);

Console.ReadKey();

锯齿数组

可以看出,二维数组对应于一个矩形,锯齿数组比较灵活,在锯齿数组中,每一行都可以有不同的大小.

在声明锯齿数组时,要一次放置左右括号.在初始化锯齿数组时,只有第一队方括号中设置该数组包含的行数.定义各行中元素个数的第二个方括号设置为空,因为这类数组的每一行

包含不同的元素个数.之后,为每一行指定行中的元素个数:

int[][] array = new int[3][];

array[0] = new int[2] { 1,2};

array[1] = new int[3] { 1,2,3};

array[2] = new int[4] { 1,2,3,4};

迭代锯齿数组中的所有元素:

for (int row = 0; row < array.Length; row++)

{

for (int element = 0; element < array[row].Length; element++)

{

Console.WriteLine("row: {0}, element: {1} , value: {2}",row,element,array[row][element]);

}

}

运行结果为:

row: 0, element: 0 , value: 1

row: 0, element: 1 , value: 2

row: 1, element: 0 , value: 1

row: 1, element: 1 , value: 2

row: 1, element: 2 , value: 3

row: 2, element: 0 , value: 1

row: 2, element: 1 , value: 2

row: 2, element: 2 , value: 3

row: 2, element: 3 , value: 4

C#编程(三十二)----------数组基础的更多相关文章

  1. 剑指Offer(三十二):把数组排成最小的数

    剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  2. Bootstrap <基础三十二>模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

  3. NeHe OpenGL教程 第三十二课:拾取游戏

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. 三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)

    摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) ...

  5. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  6. 十二. Python基础(12)--生成器

    十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...

  7. “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. “全栈2019”Java第三十二章:增强for循环Foreach语法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. 使用Typescript重构axios(三十二)——写在最后面(总结)

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  10. COJ968 WZJ的数据结构(负三十二)

    WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...

随机推荐

  1. poj1033

    模拟题,注意不需要移动的情况要特殊输出 #include <cstdio> #include <cstring> #include <cstdlib> using ...

  2. http跨域时的options请求

    1.背景 在前后端分离的项目中经常会遇到跨域请求的问题,如果没有进行跨域配置,会浏览器请求失败.我一般采用两种解决方案: 1.采用nginx进行转发,是前后端服务处于同一个域下面,从根本上避免跨域问题 ...

  3. java代码分页

    分页类 这个适用情况: 适用于前端页面已提供分页按钮样式的情况 分页规则: 首页,尾页,上页,下页 这四个按钮必定出现,中间分页动态生成5个 如:首 上 2 3 4 5 6 下 尾 public cl ...

  4. 16.网络《果壳中的c#》

    16.1 网络体系结构 System.Net.* 命名空间包含各种支持标准网络协议的通信. WebClient 外观类:支持通信HTTP或FTP执行简单的下载/上传操作. WebRequest 和 W ...

  5. ORM,DAO,MVC,POJO

    1.ORM 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间 ...

  6. 直接以管理员身份运行bat代码

    https://www.cnblogs.com/dengpeng1004/p/7044441.html

  7. linux系统下创建lvm挂载到指定目录

    1 .背景 在企业中有时我们为方便安装软件.数据的管理,需要把安装软件.数据放到固定目录下,磁盘满了方便扩展,这里假如需要一个/data目录存放数据,并单独进行挂载. 2.操作步骤 2.1  划分磁盘 ...

  8. 【BZOJ】2289: 【POJ Challenge】圆,圆,圆

    题解 二分一个横坐标,过这个横坐标做一条和y轴平行的直线,相当于在这条直线上做区间覆盖,如果区间有交的话,那么答案是True 否则的话取两个不相交的区间,如果这两个圆相离或相切则不合法 否则看看相交的 ...

  9. MarginTop 为何影响父元素的 MarginTop(转)

    add by zhj: 没找到原文 这个问题困惑了很久,虽然没有大碍早就摸出来怎么搞定它,但始终不明白原因出在哪里,如果只是IE有问题我也不会太在意,可问题是所有上等浏览器都表现如此,这样叫我怎能安心 ...

  10. 踩过无数坑实现的哈夫曼压缩(JAVA)

    最近可能又是闲着没事干了,就想做点东西,想着还没用JAVA弄过数据结构,之前搞过算法,就试着写写哈夫曼压缩了. 本以为半天就能写出来,结果,踩了无数坑,花了整整两天时间!!orz...不过这次踩坑,算 ...