数组是一个存储相同类型元素的固定大小的顺序集合。

在元素类型后面加上方括号表示数组:

char[] vowels = new char[5]; // Declare an array of 5 characters

访问特定元素可以使用方括号加索引来实现:

vowels[0] = 'a';
vowels[1] = 'e';
vowels[2] = 'i';
vowels[3] = 'o';
vowels[4] = 'u';
Console.WriteLine (vowels[1]); // e

可以使用for循环语句迭代遍历数组中的每个元素:

for (int i = 0; i < vowels.Length; i++)Console.Write (vowels[i]); // aeiou

数组的Length属性返回数组中的元素个数。数组一旦被创建,它的大小就不能被改变。System.Collection命名空间和子命名空间提供更高级别的数据结构,比如动态数组与字典。

数组初始化表达式允许在单个步骤中声明和填充数组:

char[] vowels = new char[] {'a','e','i','o','u'};

或者,

char[] vowels = {'a','e','i','o','u'};

所有数组继承自System.Array类,为所有数组提供共同的服务。这些成员包括获取 (get) 或设置 (set) 元素的方法,无论数组类型是什么。


默认元素初始化

创建数组总是使用默认值预先初始化元素。某种类型的默认值是其内存按位 (bitwise) 归零的结果。

int[] a = new int[1000];
Console.Write (a[123]); // 0

值类型 VS 引用类型

数组元素类型是值类型还是引用类型对性能有重要影响。当元素类型为值类型时,每个元素值都作为数组的一部分进行分配。例如:

public struct Point { public int X, Y; }
...
Point[] a = new Point[1000];
int x = a[500].X; // 0

如果Point是一个类,那么创建数组只会分配1000个空引用:

public class Point { public int X, Y; }
...
Point[] a = new Point[1000];
int x = a[500].X; // Runtime error, NullReferenceException

为避免此错误,必须在实例化数组后显式实例化1000个Point:

Point[] a = new Point[1000];
for (int i = 0; i < a.Length; i++) // Iterate i from 0 to 999a[i] = new Point(); // Set array element i with new point

数组本身始终是引用类型对象,而与元素类型无关。例如,下面语句是合法的:

int[] a = null;

多维数组 (Multidimensional Arrays)

多维数组有两种:矩形数组 (rectangular) 和锯齿数组 (jagged)。矩形数组表示一个n维内存块,锯齿数组是数组的数组。

矩形数组 (Rectangular arrays)

矩形数组使用逗号来分隔每个维度。下面声明了一个矩形二维数组,其中维度为3乘3:

int[,] matrix = new int[3,3];

数组的GetLength方法返回给定维度的长度 (从0开始):

for (int i = 0; i < matrix.GetLength(0); i++)for (int j = 0; j < matrix.GetLength(1); j++)matrix[i,j] = i * 3 + j;

可以按如下方式初始化矩形数组 (创建与上面代码示例相同的数组):

int[,] matrix = new int[,]
{{0,1,2},{3,4,5},{6,7,8}
};

锯齿数组 (Jagged arrays)

锯齿数组使用连续的方括号来表示每个维度。下面是一个声明锯齿二维数组的示例,其中最外层的维度是3:

int[][] matrix = new int[3][];

为什么是 new int[3][],而不是 new int[][3],可以查看 Eric Lippert 的文章 http://albahari.com/jagged。

声明中没有指定内部维度,因为与矩形数组不同,每个内部数组可以是任意长度。每个内部数组都隐式初始化为 null,而不是空数组。必须手动创建每个内部数组:

for (int i = 0; i < matrix.Length; i++)
{matrix[i] = new int[3]; // Create inner arrayfor (int j = 0; j < matrix[i].Length; j++)matrix[i][j] = i * 3 + j;
}

锯齿数组可以按如下方式初始化:

int[][] matrix = new int[][]
{new int[] {0,1,2},new int[] {3,4,5},new int[] {6,7,8,9}
};

简化的数组初始化表达式

缩短数组初始化表达式有两种方法。第一种方法是省略new操作符和类型限定符:

char[] vowels = {'a','e','i','o','u'};
int[,] rectangularMatrix =
{{0,1,2},{3,4,5},{6,7,8}
};
int[][] jaggedMatrix =
{new int[] {0,1,2},new int[] {3,4,5},new int[] {6,7,8}
};

第二种方法是使用var关键字,它告诉编译器隐式地确定一个局部变量的类型:

var i = 3; // i is implicitly of type int
var s = "sausage"; // s is implicitly of type string
// Therefore:
var rectMatrix = new int[,] // rectMatrix is implicitly of type int[,]
{{0,1,2},{3,4,5},{6,7,8}
};
var jaggedMat = new int[][] // jaggedMat is implicitly of type int[][]
{new int[] {0,1,2},new int[] {3,4,5},new int[] {6,7,8}
};

隐式类型可以在数组中进一步使用:可以在new关键字之后省略类型限定符,并让编译器推断数组类型:

var vowels = new[] {'a','e','i','o','u'}; // Compiler infers char[]

为了实现这一点,所有元素都能够隐式地转换为某单个类型 (并且至少有一个元素必须是该类型,并且必须只有一个最佳类型)。例如:

var x = new[] {1,10000000000}; // all convertible to long

边界检查

运行时将检查所有数组索引边界。如果使用无效索引,将引发IndexOutOfRangeException

int[] arr = new int[3];
arr[3] = 1; // IndexOutOfRangeException thrown

数组边界检查对于类型安全和简化调试是必要的。


练习

题目:给定一组数据 nums,返回小于数值 a 的数据。

public class Solution {public int[] NumberOfArithmeticSlices(int[] nums, int a) {int cnt = 0;int n = nums.Length;bool[] bLess = new bool[n];for(int i=0; i<n; ++i){if(nums[i]<a){bLess[i] = true;++cnt;}else{bLess[i] = false;}}int[] ans = new int[cnt];int pos = 0;for(int i=0; i<n; ++i){if(bLess[i]==true){ans[pos] = nums[i];++pos;}}return ans;}
}

【C# 7.0 in a Nutshell】目录

【C# 7.0 in a Nutshell】第2章 C#语言基础——数组相关推荐

  1. Gradle2.0用户指南翻译——第六章. 构建脚本基础

    翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tre ...

  2. 《C#与.NET3.0高级程序设计》前3章读书笔记

    第1部分 C# 和 .NET 平台简介 第1章 .NET之道 从第2章到第10章是C#语言的知识内容,在第1章中的程序集(assembly)在后面第11章详述,CIL (公共中间语言)在后面的第15章 ...

  3. 《C#3.0 in a Nutshell ,3rd Edition》之序言篇

    前言 最近在图书馆看到了<C#3.0核心技术>这本书,看了一下觉得挺不错的,C#3.0的技术从基础语法到新特性到涉及到了,是一部学习C#3.0的好书,本想从网上下载电子版却没找不到,却但看 ...

  4. 【C# 7.0 in a Nutshell】第3章 在C#中创建类型——类

    类 (Class) 是最常用的引用类型.最简单的类声明如下: class YourClassName {} 更复杂的类有如下选项: class关键字前面:属性(attributes)和类修饰符(cla ...

  5. 【C# 7.0 in a Nutshell】第4章 C#的高级特性——委托

    委托是一个知道如何调用方法的对象. 委托类型(delegate type)定义委托实例(delegate instances)可以调用的方法类型.具体来说,它定义了方法的返回类型和参数类型.下面定义了 ...

  6. ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

    深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第 ...

  7. 将编号为0和1的两个栈存放于一个数组空间V[m]中。

    目录 1.题目描述 2.算法实现 1.题目描述 将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端.当第0号栈的栈顶指针top[0]等于-1时该栈为空:当第1号栈的栈顶指针to ...

  8. c语言打印数组元素_C程序打印元素差为0或1的子集数

    c语言打印数组元素 Given an array of integers, find and print the maximum number of integers you can select f ...

  9. C项目案例实践(0)-语言基础

    1.C语言数据类型 所谓数据类型是按被定义变量的性质.表示形式.占据存储空间的多少.构造特点来划分的.C中数据类型可分为基本数据类型.构造数据类型.指针类型.空类型4大类,结构如图: (1)基本数据类 ...

最新文章

  1. golang 函数指针相等比较
  2. Windows句柄表学习笔记 —— 句柄表全局句柄表
  3. boost::first_scalar的测试程序
  4. GPG96244QS1屏驱动难题
  5. URAL1018 Binary Apple Tree
  6. 灵活理解思科三层结构
  7. ubuntu 14.04配置lamp粗略
  8. Qt之QListView使用
  9. win2003 搭建文件服务器,用win2003+server搭建安全文件服务器.doc
  10. 【案例练习】17个华丽的UI效果的实现 ,激发你的创造灵感
  11. 喜欢计算机专业的理由英语,计算机专业的英文自我介绍
  12. 《阿里巴巴java规范》 Result 方式杂谈
  13. UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initial
  14. Python密码库Cryptography探究学习
  15. 计算机系学生未来憧憬,北京科技大学计算机与通信工程学院-脚踏实地,展望未来——计通学院2018级本科生年级会...
  16. 触宝线上笔试2018
  17. Amazon/eBay/Wish/Lazada/速卖通/Shopee/tiktok/沃尔玛/煤炉/补单黑科技?如何解决账号问题。
  18. IOS开发系列(一) - Xcode
  19. 制作ubuntu系统的 usb启动盘
  20. mpf11_2_chain rule_forward_backpropag_Jacobian_error_loss_RSI_patternTriangl_CMFi_Williams%R_AO_VWAP

热门文章

  1. iText的使用(1)-- 组合图片生成PDF
  2. 数据合并处理concat
  3. 基于单片机热电偶智能体温检测系统设计-基于单片机一氧化碳CO有毒气体采集报警系统设计-基于单片机热电偶智能体温检测系统设计(仿真,原理图,报告)【资料转发分享】
  4. 用Ai画一杯牛奶和饼干
  5. 中策橡胶采用ET工业大脑效果显著,获选IDC中国数字化转型大奖
  6. WPA在计算机英语中什么意思,Wi-Fi保护接入(WPA)是什么意思?(图)
  7. 再读Golang中的异常处理
  8. 中国AI军团称霸全球口语翻译大赛!搜狗夺冠,讯飞阿里二三
  9. 简易微信小程序开发——推箱子
  10. vue3+egg-仿掘金官网