C# 多维数组 交错数组的区别,即 [ , ] 与 [ ][ ]的区别
多维数组的声明
在声明时,必须指定数组的长度,格式为 type [lenght ,lenght ,lengh, ... ]
1 | int [,] test1 = new int [3,3]; |
或声明时即赋值,由系统推断长度
1 2 3 4 5 | int [,] test1 = { {1,2,3}, {1,2,3}, {1,2,3}, }; |
交错数组的声明
声明时,至少需要指定第一维的长度,格式为 type [ ] [ ] [ ] ...
1 | int [][] test1 = new int [5][]; int [][] test1 = new int [][]; //注意,此的声明方式是错的 |
或者声明时即赋值,由系统推断长度
1 2 3 4 5 | int [][] test1 = { new int [] {1,2,3,4}, new int [] {1,2,3}, new int [] {1,2} }; |
多维数组与交错数组 二者的相同、区别
两者声明时,都必须指定长度,多维数组必须指定每一维的长度,而交错数组需要至少需要指定第一维的长度。
多维数组声明时,符号是这样的 [ , , , , ],逗号在 方括号 [ ] 中,每一维长度用逗号分隔。而交错数组每一维独立在 [ ]中
当你想指定数组长度时,只能在等号右侧指定,int [,] test1 = new int [3,3] 是正确的 ;int [6,4] test1 = new int [6,4] 是错误的;
下面以代码形式说明
大小不一致的多维数组会发生错误
1 2 3 4 5 6 7 8 9 | int [,] test1 = { {1,2,3,4}, {1,2,3}, {1,2} }; //这样是错的,长度必须一致<br><br>int [,] test1 = new int [4,5] { {1,2,3,4,5}, {1,2,3}, {1,2,3} }; //这样也是错误的,长度必须一致,必须为每一个位置赋值<br><br> |
这一点C#与C语言有所区别,C语言可以不全赋值,没有赋值的位置系统默认为0。
下面的方法是正确的
1 2 3 4 5 | int [,] test1 = { {1,2,3}, {1,2,3}, {1,2,3} }; |
初始化交错数组
上面已经说了声明一个交错数组的方法
1 2 3 4 5 | int [][] test1 = { new int [] {1,2,3,4}, //new int[4] {1,2,3,4} new int [] {1,2,3}, //new int[3] {1,2,3} new int [] {1,2} }; |
注意,在里面有 new int[],这正是交错数组的特性。交错数组是由数组构成的数组,交错数组要求为内部的每个数组都创建实例。
即交错数组的每一维都是一个实例,每一个实例为一个数组。
数组的长度是固定的
无论多维数组还是交错数组,长度都是固定的,不能随意改变。
获取数组的长度
使用 对象.Length 获取数组的长度,需要注意的是,多维数组的长度是每一维相乘,即元素总个数。
1 2 3 4 5 6 7 | int [,] test1 = { {1,2,3}, {1,2,3}, {1,2,3} }; Console.WriteLine(test1.Length); 输出为 9 |
而交错数组的长度则是“内部组成的数组的个数”,例如
1 2 3 4 5 6 | int [][] test1 = { new int [] {1,2,3}, new int [] {1,2,3}, new int [] {1,2,3}, }; Console.WriteLine(test1.Length); <br>输出为 3 |
方法
多维数组、交错数组的方法无差别,都具有Sort()、Clear()等方法,这里不再赘述,关于数组的高级用法,请查阅
https://www.jb51.net/Special/265.htm
下列为System.Array类的属性
由于系统提供的方法比较多,有兴趣请查阅
https://docs.microsoft.com/zh-cn/dotnet/api/system.array?view=netframework-4.7.2
使用数组初始化类型
在C#中有 lambda、匿名类等等,C# 5.0/6.0 后,给声明类、声明类型类型、赋值等有了很方便的操作方法。下面举例测试。
例子1
使用数组对集合、集合泛型等初始化
声明一个 List 泛型集合
using System.Collections.Generic; //头部引入 //main中的代码 static void Main(string[] args) { List<string> list = new List<string>(); Console.ReadKey(); }
那么,给集合 list 增加一个项,用 Add() 方法
static void Main(string[] args) { List<string> list = new List<string>(); //增加 list.Add("a"); list.Add("b"); list.Add("c"); list.Add("d"); list.Add("e"); list.Add("f"); list.Add("g"); Console.ReadKey(); }
利用 “数组” 来添加新项
List<string> list = new List<string>(){"a","b","c","d","e","f"}; List<string> list = new List<string>{"a","b","c","d","e","f"}; //以上两种方法都可以,注意后面有没有 ()
例子2
上面的例子利用数组直接在集合声明时初始化,但是不能很好的声明“骚操作”。
试试交错数组
1,在 program 类 所在的命名空间中写一个类
public class Test { public int x; public int y; public void What() { Console.WriteLine(x + y); } }
2,在 Main 方法中
static void Main(string[] args) { List<Test> list = new List<Test>() { new Test{x=1,y=6}, new Test{x=8,y=6}, new Test{x=4,y=8}, new Test{x=5,y=7}, new Test{x=3,y=3}, new Test{x=6,y=6}, new Test{x=9,y=666}, new Test{x=7,y=6}, }; Console.ReadKey(); }
完整代码如下
public class Test { public int x; public int y; public void What() { Console.WriteLine(x + y); } } class Program { static void Main(string[] args) { List<Test> list = new List<Test>() { new Test{x=1,y=6}, new Test{x=8,y=6}, new Test{x=4,y=8}, new Test{x=5,y=7}, new Test{x=3,y=3}, new Test{x=6,y=6}, new Test{x=9,y=666}, new Test{x=7,y=6}, }; Console.ReadKey(); } }
由于类引用类型,它的内存是引用地址,不像 int、char等类型,所以在对类(引用类型)使用数组、集合等形式时,可以用 “交错数组” 来理解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端