C# 数组
在 C# 中,数组实际上是对象,而不只是如在 C 和 C++ 中的连续内存的可寻址区域。
交错数组是数组的数组,因此其元素为引用类型且被初始化为 null 。
new 运算符 用于在堆上创建对象。所以数组需要用new声明来给数组在堆上开一个存储空间。
值类型和引用类型数组
SomeType[] array4 = new SomeType[10];
此语句的结果取决于 SomeType 是值类型还是引用类型。 如果它是值类型,该语句将创建一个 10 个元素的数
组,其中每个元素的类型都为 SomeType 。 如果 SomeType 是引用类型,该语句将创建一个 10 个元素的数组,其
中每个元素都将被初始化为空引用。 在两个实例中,元素均初始化为元素类型的默认值。 有关值类型和引用类
型的详细信息,请参阅值类型和引用类型。
空数组
如果您必须创建一个空数组,您可以这样做:
string[] emptyStringArray = new string[0];
string[] s = { };
所以使用数组的时候要注意判断数组
if
(array==
null
||array.Length==0)
{
//这个数组未初始化 或者为空
}
一维数组
数组声明:1、int[] array = new int[5];//array 已经分配空间可以直接使用,默认值是0,尚未赋值 2、int[] array3;// 尚未分配地址空间,但必须使用 new 运算符向此变量分配地址空间 array3 = new int[] { 1, 3, 5, 7, 9 }; // 数组声明+初始化:1、int[] array1 = new int[] { 1, 3, 5, 7, 9 }; 2、int[] array2 = { 1, 3, 5, 7, 9 };//这称为隐式类型化数组:
多维数组
多维度数组声明:int[,] array = new int[4, 2];//明创建一个具有四行两列的二维数组。
int[,,] array1 = new int[4, 2, 3];//三维数组
多维数组声明+初始化:
// Two-dimensional array. int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; // The same array with dimensions specified. int[,] array2Da = new int[4, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; // A similar array with string elements. string[,] array2Db = new string[3, 2] { { "one", "two" }, { "three", "four" }, { "five", "six" } }; // Three-dimensional array. int[,,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } }; // The same array with dimensions specified. int[,,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 }, { 10, 11, 12 } } };
int[,] array4 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };////这称为隐式类型化数组:
属性
int count1 = student.Length;//获取到的是整个二维数组的长度,所有元素长度总和
int row = student.Rank;//获取维数,几维的数组
方法
int col = student.GetLength(0);//获取指定维度中元素的个数. 一维数组的长度
int col = student.GetLength(1);//获取指定维度中元素的个数,二维数组的长度
int col = student.GetLength(n);//获取指定维度中元素的个数,三维数组的长度
对多维数组使用 foreach
多维数组式一行一行的遍历,也可以用for嵌套
int[,] numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } };
// Or use the short form:
// int[,] numbers2D = { { 9, 99 }, { 3, 33 }, { 5, 55 } };
foreach (int i in numbers2D)
{
System.Console.Write("{0} ", i);
}
// Output: 9 99 3 33 5 55
交错数组
因为交错数组的元素是一个数组对象.它的长度等于它的直接元素的个数而不是元素的子元素的个数对象。因此可以说,交错数组是一维数组。一种有点奇葩的一维数组。
交错数组是一个数组,其元素是数组,大小可能不同。 交错数组有时称为 “数组的数组”。
交错数组声明:int[][] jaggedArray = new int[3][];////new int[][] 第二个[]指明了其中的元素是一维数组,所以其元素只能是一维数组,混进了二维、三维的数组会直接报错。
//第一种 初始化 交错数组初始化: jaggedArray 的元素后才可使用它。 可按下方操作初始化元素: jaggedArray[0] = new int[5]; jaggedArray[1] = new int[4]; jaggedArray[2] = new int[2];
//第二种 初始化
使用初始化表达式通过值来填充数组元素,这种情况下不需要数组大小。 交错数组jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };
声明+初始化:int[][]jaggedArray3 ={new int[] { 1, 3, 5, 7, 9 },new int[] { 0, 2, 4, 6 },new int[] { 11, 22 }};//请注意:不能从元素初始化中省略 new 运算符,第二层的数组还未分配地址空间:
交错数组的2种遍历:
第一种:利用交错数组式数组的数组这个概念遍历:
int[][] numsTwoNew = { new int[] { 1, 2, 3 }, new int[] { 1, 2, 3, 4 } }; foreach (int[] intArr in numsTwoNew) { foreach (int e in intArr) Console.Write(e + " "); Console.WriteLine(); }
第二种:for 循环精准控制
// Initialize the elements. int[][] arr = new int[2][];
arr[0] = new int[5] { 1, 3, 5, 7, 9 }; arr[1] = new int[4] { 2, 4, 6, 8 }; // Display the array elements. for (int i = 0; i < arr.Length; i++) { System.Console.Write("Element({0}): ", i); for (int j = 0; j < arr[i].Length; j++) { System.Console.Write("{0}{1}", arr[i][j], j == (arr[i].Length - 1) ? "" : " "); } System.Console.WriteLine(); }
创建包含匿名类型的隐式类型的数组:
var contacts = new[]
{
new {
Name = " Eugene Zabokritski",
PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
},
new {
Name = " Hanying Feng",
PhoneNumbers = new[] { "650-555-0199" }
}
};
数组可以作为实参传递给方法形参。 由于数组是引用类型,因此方法可以更改元素的值。
动态运行时创建数组
下面动态的创建一个长度为2的字符串数组。
Array arr = Array.CreateInstance(typeof(string), 2);
Console.WriteLine(array.GetType().Name+" " +array.Length); //赋值 arr.SetValue("hello", 0); arr.SetValue("world", 1); //取值 arr.GetValue(0); //将其转换为静态数组 string[] cs_arr = (string[])arr;
判断数组是否相等
若要判断这两个数组是否相等该如何判断呢?你是否能够判断出下面的比对结果
bool eq1 = a1==a2;
bool eq2 = object.ReferenceEquals(a1,a2);
bool eq3 = a1.Equals(a2);
上面的三个比较的结果均为 false。那是因为数组本身是引用类型的,上面的三种方式比较的均为引用对象在堆栈中的地址,明显是不相同的。
那么,要比较两个数组是否完全相同,除了遍历外,还有其它的方式吗?答案是肯定的,其方式如下示:
int[] a = { 1, 2, 3, 4, 5, 5 };
int[] b = { 1, 2, 3, 4, 5, 5 };
IStructuralEquatable equ = a;
Console.WriteLine(equ.Equals(b, EqualityComparer<object>.Default));
详细查看官方文档:https://docs.microsoft.com/en-us/dotnet/api/system.collections.istructuralequatable?view=net-5.0