C# 数组
数组是一种数据结构,它包含若干相同类型的变量。数组是使用类型声明的:type[] arrayName;
下面的示例创建一维、多维和交错数组:
数组概述
数组具有以下属性:
-
数值数组元素的默认值设置为零,而引用元素的默认值设置为 null。
-
交错数组是数组的数组,因此,它的元素是引用类型,初始化为 null。交错数组元素的维度和大小可以不同。
-
数组的索引从零开始:具有 n 个元素的数组的索引是从 0 到 n-1。
-
数组元素可以是任何类型,包括数组类型。
-
数组类型是从抽象基类型 Array 派生的引用类型。由于此类型实现了 IEnumerable 和 IEnumerable,因此可以对 C# 中的所有数组使用 foreach 迭代。
在 C# 中,数组实际上是对象,而不只是像 C 和 C++ 中那样的可寻址连续内存区域。
System.Array 类提供了许多其他有用的方法和属性,用于排序、搜索和复制数组。(mscorlib.system.array对象查看)
方法名 | 描述 | 重载 |
Array.Length | 获取数组的长度 | |
Array.Rank | 显示数组的维数 | |
Array.GetUpperBound(int dimension) | 获取 System.Array 的指定维度的上限。参数 dimension: Array 的从零开始的维度 | |
GetLowerBound(int dimension) | 下限 | |
object GetValue(int index1, int index2) | 返回索引值 | 多重 |
SetValue(object value, int index) | ||
IndexOf<T>(T[] array, T value) | 搜索指定的T类型的对象,并返回整个 Array 中第一个匹配项的索引。<T>必需重载Object的 Equals 比较方法 | 多重 |
LastIndexOf<T>(T[] array, T value) | 搜索指定的T类型的对象,并返回整个 Array 中最后一个匹配项的索引。 | 多重 |
Sort<T>(T[] array) | 使用Array的每个元素的System.IComparable<T>泛型接口实现,对整个Array中的元素进行排序。<T>必需实现IComparable接口 | 多重 |
ForEach<T>(T[] array, System.Action<T> action) | 多重 | |
更多在对象查看器:mscorlib.system.arra中 |
对数组使用 foreach(支持多维)
foreach ( int i in numbers)
{
System.Console.WriteLine(i);
}
数组作为参数传递
调用数组参数的方法定义
void PrintArray(int[] arr)
{
//code
}
传递
可以将初始化的一维数组传递给方法。例如:
PrintArray(theArray);
也可以在一个步骤中初始化并传递新数组。例如:
void PrintArray(new int[] { 1, 3, 5, 7, 9 })
使用 ref 和 out 传递数组时,ref 要初始化, out 可以不初始化。
ArrayList 和 List 数组
两者是较为复杂的数组,引用 System.Collections 命名空间
ArrayList 或 List 对象是较为复杂的数组。ArrayList 类和 List 泛型类提供多数 System.Collections 类都提供的但 Array 类未提供的一些功能。例如:
-
Array 的容量是固定的,而 ArrayList 或 List 的容量可根据需要自动扩充。如果更改了 Capacity 属性的值,则可以自动进行内存重新分配和元素复制。
-
ArrayList 和 List 提供添加、插入或移除某一范围元素的方法。在 Array 中,您只能一次获取或设置一个元素的值。
-
使用 Synchronized 方法很容易创建 ArrayList 或 List 的同步版本。Array 将实现同步的任务留给了用户。
-
ArrayList 和 List 提供将只读和固定大小包装返回到集合的方法;而 Array 不提供。
另一方面,Array 提供了 ArrayList 和 List 所缺少的某些灵活性。例如:
-
可以设置 Array 的下限,但 ArrayList 或 List 的下限始终为零。
-
Array 可以具有多个维度,而 ArrayList 或 List 始终只是一维的。
-
特定类型(不包括 Object)的 Array 的性能优于 ArrayList,这是因为 ArrayList 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量),List 的性能与同类型的数组十分相近。
需要数组的大多数情况都可以改为使用 ArrayList 或 List;它们更容易使用,并且一般与相同类型的数组具有相近的性能。
Array 位于 System 命名空间中;ArrayList 位于 System.Collections 命名空间中;List 位于 System.Collections.Generic 命名空间中。
{
static void Main()
{
// Declare a single-dimensional array
int [] array1 = new int [ 5 ];
// Declare and set array element values
int [] array2 = new int [] { 1 , 3 , 5 , 7 , 9 };
// Alternative syntax
int [] array3 = { 1 , 2 , 3 , 4 , 5 , 6 };
// Declare a two dimensional array
int [,] multiDimensionalArray1 = new int [ 2 , 3 ];
// Declare and set array element values
int [,] multiDimensionalArray2 = { { 1 , 2 , 3 }, { 4 , 5 , 6 } };
// Declare a jagged array
int [][] jaggedArray = new int [ 6 ][];
// Set the values of the first array in the jagged array structure
jaggedArray[ 0 ] = new int [ 4 ] { 1 , 2 , 3 , 4 };
}
}