C# 中的数组(array)
特性
数组是一个无序的元素序列。数组元素存储在一个连续性的内存块中,并可使用一个整数索引来访问。
C# 声明数组变量时,数组的大小不是声明的一部分。这点与C/C++有些区别。
int[] dogs; // 声明数组 // 声明时不需要指定数组的大小
只有在实际创建数组实例的时候,才需要指定数组的大小。创建数组实例时编译器默认将数组元素初始化为0,null,false(依元素类型不同)。
pins = new int[4]; // 只有在实际创建数组实例的时候,才需要指定数组的大小。
以上两个语句运行后结果如下:

数组实例的大小不一定是常量,它可以在运行时计算。
int size = int.Parse(Console.ReadLine());
int[] pins = new int[size];
某些情况下,数组大小可能为 0,这个设计是有意义的。大小为 0 的数组不是一个 null(空)数组。除了基本数据类型,数组元素还可以是结构、枚举或者类。
大括号中的值不一定是常量,它们可以是在运行时计算的值。
Random r = new Random();
int[] pins = new int[4]{r.Next()%10,
r.Next()%10,
r.Next()%10,
r.Next()%10};
初始化
初始化数组变量。大括号中的值的数量必须和要创建的数组实例的大小完全匹配!
int[] pins = new int[3] { 1, 2, 3, 4 }; // 编译时错误
int[] pins = new int[4] { 1, 2, 3 }; // 编译时错误
int[] pins = new int[4] { 1, 2, 3, 4 }; // 正确
初始化一个数组变量时,实际上可省略 new 表达式和数组的大小,编译器将根据初始值的数量来计算大小。
int[] pins = { 1, 2, 3, 4 }; // 正确
创建一个由结构构成的数组时,为了初始化数组的每个结构,可以调用结构构造器。
struct Time
{
private int hours, minutes, seconds; public Time(int hh, int mm)
{
hours = hh;
minutes = mm;
seconds = 0;
}
} Time[] schedule = {new Time(12, 30), new Time(5, 30)}; // 调用自定义的结构构造器
隐式类型的数组创建
匿名类(anonymous class)是一个没有名字的类,只能包含 public 字段,字段必须全部初始化,不可以是 static 字段,而且不能在其中指定方法。
可以创建隐式类型的数组。如果在声明数组的时候指定了一个初始值列表,就可以让 C# 编译器自己推断数组中的元素的类型。
var names = new[]{"Steven", "Lily", "Tom", "Miley"}; // C# 推断 names 是一个 string 类型
Console.WriteLine(names[0]);
Console.WriteLine(names[3]);
// 隐式类型转换的数组尤其适用于匿名类型
var people = new[]{new {Name = "Steven", Age = 27},
new {Name = "Lily", Age = 25},
new {Name = "Tom", Age = 8},
new {Name = "Miley", Age = 6}};
// 数组中的每个元素都是匿名类型
// 并且每个元素都必须指定相同的匿名类型
访问及遍历数组有如下方法,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace arrayType
{
class Program
{
static void Main(string[] args)
{
string[] names = new[]{"Steven", "Lily", "Tom", "Miley"};
Console.WriteLine(names[0]);
Console.WriteLine(names[3]); Console.WriteLine();
Console.WriteLine("用 for 遍历字符串数组");
for (int i = 0; i < names.Length; i++)
// length 是属性而不是方法,不要加 '()'
{
Console.WriteLine(names[i]);
} Console.WriteLine();
Console.WriteLine("用 foreach 遍历 string 数组");
// foreach 是遍历数组的首选方式
foreach(string name in names)
{
Console.WriteLine(name);
} var people = new[]{new {Name = "Steven", Age = 27},
new {Name = "Lily", Age = 25},
new {Name = "Tom", Age = 8},
new {Name = "Miley", Age = 6}}; Console.WriteLine();
Console.WriteLine("用 foreach 遍历 var 数组");
foreach(var person in people)
{
Console.WriteLine(person);
} Console.WriteLine();
Console.WriteLine("用 foreach 遍历 var 数组");
foreach (var person in people)
{
Console.WriteLine("Name: {0}, Age: {1}", person.Name, person.Age);
} Console.WriteLine();
}
}
}

复制数组
复制数组有如下方法,但只有最后一种是真正的复制。
int[] pins = { 1, 2, 3, 4 };
int[] copy = new int[pins.Length];
pins.CopyTo(copy, 0); // 将数组 pins 的内容复制到数组 copy
// CopyTo 是浅拷贝,从指定位置开始复制,复制后两个数组都引用同一组对象
int[] pins = { 1, 2, 3, 4 };
int[] copy = new int[pins.Length];
Array.Copy(pins, copy, copy.Length); // Copy 方法是浅拷贝
int[] pins = { 1, 2, 3, 4 };
int[] copy = (int[])pins.Clone(); // Clone 方法是浅拷贝
// Clone 放回的是一个 object,所以必须进行类型准换
int[] pins = { 1, 2, 3, 4 };
int[] copy = new int[pins.Length];
for (int i = 0; i < copy.Length; i++)
{
copy[i] = pins[i]; // 深拷贝,也就是产生了两个数组
}
维数
数组的维数是没有限制的,可以创建多维数组。
string[,] stars = new string[6,8]; // 创建二维数组,6 行 8 列
stars[2, 6] = "Mars"; // 将单元格(2, 6)的元素设为 Mars
// 使用多维数组时,要准备好捕捉并处理 OutOfMemoryException
C# 中的数组(array)的更多相关文章
- C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲
使用C++风格的数组.不须要管理内存. array要注意不要溢出,由于它是栈上开辟内存. array适用于不论什么类型 #include<iostream> #include< ...
- js中的数组Array定义与sort方法使用示例
Array的定义及sort方法使用示例 Array数组相当于java中的ArrayList 定义方法: 1:使用new Array(5 )创建数组 var ary = new Array(5): ...
- JS中有关数组Array的常用方法函数
Array对象的方法主要有如下几种(我所知道的): concat()连接两个或多个数组,并返回结果,但是值得注意的是该方法并不改变数组本身,而仅仅返回一个数组连接的副本. push()在数组后面添加一 ...
- JavaScript中的数组Array
抄自:https://www.jianshu.com/p/7e160067a06c js中数组的方法种类众多,有ES5之前版本中存在的,ES5新增,ES6新增等:并且数组的方法还有原型方法和从obje ...
- PIL中的Image和numpy中的数组array相互转换
1. PIL image转换成array img = np.asarray(image) 需要注意的是,如果出现read-only错误,并不是转换的错误,一般是你读取的图片的时候,默认选择的是&quo ...
- JavaScript中的数组Array方法
push(),pop()方法 push(),pop()方法也叫栈方法,push()可以理解成,向末尾推入,而pop()恰好相反,可以理解成从末尾移除(取得). var nums=[1,2,3,4]; ...
- javascript类型系统——数组array
× 目录 [1]创建 [2]本质 [3]稀疏[4]长度[5]遍历[6]类数组 前面的话 除了对象之外,数组Array类型可能是javascript中最常用的类型了.而且,javascript中的数组与 ...
- C#中数组Array、ArrayList、泛型List<T>的比较
在C#中数组Array,ArrayList,泛型List都能够存储一组对象,但是在开发中根本不知道用哪个性能最高,下面我们慢慢分析分析. 一.数组Array 数组是一个存储相同类型元素的固定大小的顺序 ...
- JavaScript中数组Array方法详解
ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...
随机推荐
- 搭建Git Server
windows上如何搭建Git Server Git在版本控制方面,相比与SVN有更多的灵活性,对于开源的项目,我们可以托管到Github上面,非常方便,但是闭源的项目就会收取昂贵的费用.那么私有 ...
- (转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)
网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html 在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码: struct d ...
- IntelliJ IDEA 部署Tomcat及创建一个web工程
一.部署Tomcat 二.新建一个web工程 1.新建一个Project 2.现在建立一个简单的web工程,所以只勾选下面选中的,此外,本版本(IntelliJ IDEA 14.1.5只支持3.1版本 ...
- spring mvc中的@PathVariable(转)
鸣谢:http://jackyrong.iteye.com/blog/2059307 ------------------------------------------------ spring m ...
- uc/os初始化
操作系统初始化函数OS_INIT是操作系统在开始运行的最初,对全局变量.任务控制块.就绪表.事件及消息队列等重要数据结构进行的初始化操作,并创建空闲任务.统计任务等系统任务.该函数必须在创建用 ...
- BZOJ 3173 [Tjoi2013] 最长上升子序列 解题报告
这个题感觉比较简单,但却比较容易想残.. 我不会用树状数组求这个原排列,于是我只好用线段树...毕竟 Gromah 果弱马. 我们可以直接依次求出原排列的元素,每次找到最小并且最靠右的那个元素,假设这 ...
- Firefly——dbentrust 示例DEMO (源码+教程)
原地址:http://www.9miao.com/question-15-54002.html Firefly——dbentrust示例说明一.数据库准备本篇示例演示的是firefly与MySQL和m ...
- IIC驱动分析
IIC设备是一种通过IIC总线连接的设备,由于其简单性,被广泛引用于电子系统中.在现代电子系统中,有很多的IIC设备需要进行相互之间通信 IIC总线是由PHILIPS公司开发的两线式串行总线,用于连接 ...
- Ubuntu中安装DiscuzX2
http://blog.csdn.net/kevin_ysu/article/details/7452938 一.Apache的安装 Apache作为一个功能强大的Web程序,自然是架建Web服务器的 ...
- 不同VLAN之间互相通信
前话 我们经常到机房上课,想必对机房后面那层叠的跟DVD一样的机器有印象吧,那些就是交换机. 交换机作用是什么? 我这里度娘一下: 交换机(Switch)意为"开关"是一种用于电( ...