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)
{
//这个数组未初始化 或者为空
}

 一维数组

数组声明:1int[] array = new int[5];//array 已经分配空间可以直接使用,默认值是0,尚未赋值

        2int[] array3;// 尚未分配地址空间,但必须使用 new 运算符向此变量分配地址空间  array3 = new int[] { 1, 3, 5, 7, 9 }; //


数组声明+初始化:1int[] array1 = new int[] { 1, 3, 5, 7, 9 };
               2int[] 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

                                  https://blog.csdn.net/weixin_28902341/article/details/113892390?utm_term=c#%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E7%A9%BA%E6%95%B0%E7%BB%84&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-5-113892390&spm=3001.4430

posted @ 2021-09-11 02:11  小林野夫  阅读(629)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/