C# 多维数组 交错数组的区别,即 [ , ] 与 [ ][ ]的区别 (转载)
多维数组的声明
在声明时,必须指定数组的长度,格式为 type [lenght ,lenght ,lengh, ... ]
int[,] test1 = new int[, ];
或声明时即赋值,由系统推断长度
int [,] test1 = {
{,,},
{,,},
{,,},
};
交错数组的声明
声明时,至少需要指定第一维的长度,格式为 type [ ] [ ] [ ] ...
int[][] test1 = new int[][];
int [][] test1 = new int[][]; //注意,此的声明方式是错的
或者声明时即赋值,由系统推断长度
int [][] test1 = {
new int[] {,,,},
new int[] {,,},
new int[] {,}
};
多维数组与交错数组 二者的相同、区别
两者声明时,都必须指定长度,多维数组必须指定每一维的长度,而交错数组需要至少需要指定第一维的长度。
多维数组声明时,符号是这样的 [ , , , , ],逗号在 方括号 [ ] 中,每一维长度用逗号分隔。而交错数组每一维独立在 [ ]中
当你想指定数组长度时,只能在等号右侧指定,int [,] test1 = new int [3,3] 是正确的 ;int [6,4] test1 = new int [6,4] 是错误的;
下面以代码形式说明
大小不一致的多维数组会发生错误
int [,] test1 = {
{,,,},
{,,},
{,}
}; //这样是错的,长度必须一致
int [,] test1 = new int [,] {
{,,,,},
{,,},
{,,}
}; //这样也是错误的,长度必须一致,必须为每一个位置赋值
这一点C#与C语言有所区别,C语言可以不全赋值,没有赋值的位置系统默认为0。
下面的方法是正确的
int [,] test1 = {
{,,},
{,,},
{,,}
};
初始化交错数组
上面已经说了声明一个交错数组的方法
int [][] test1 = {
new int[] {,,,}, //new int[4] {1,2,3,4}
new int[] {,,}, //new int[3] {1,2,3}
new int[] {,}
};
注意,在里面有 new int[],这正是交错数组的特性。交错数组是由数组构成的数组,交错数组要求为内部的每个数组都创建实例。
即交错数组的每一维都是一个实例,每一个实例为一个数组。
数组的长度是固定的
无论多维数组还是交错数组,长度都是固定的,不能随意改变(应该是指不能像List一样,随意增加和删除元素)。
获取数组的长度
使用 对象.Length 获取数组的长度,需要注意的是,多维数组的长度是每一维相乘,即元素总个数。
int[,] test1 = {
{,,},
{,,},
{,,}
};
Console.WriteLine(test1.Length);
//输出为 9
而交错数组的长度则是“内部组成的数组的个数”,例如
int[][] test1 = {
new int[] {,,},
new int[] {,,},
new int[] {,,},
};
Console.WriteLine(test1.Length);
//输出为 3
方法
多维数组、交错数组的方法无差别,都具有Sort()、Clear()等方法,这里不再赘述,关于数组的高级用法,请查阅
https://www.jb51.net/Special/265.htm
下列为System.Array类的属性
由于系统提供的方法比较多,有兴趣请查阅
https://docs.microsoft.com/zh-cn/dotnet/api/system.array
使用数组初始化类型
在C#中有 lambda、匿名类等等,C# 5.0/6.0 后,给声明类、声明类型类型、赋值等有了很方便的操作方法。下面举例测试。
例子1
使用数组对集合、集合泛型等初始化
声明一个 List 泛型集合
using System;
using System.Collections.Generic; namespace NetCore
{
class Program
{
//main中的代码
static void Main(string[] args)
{
List<string> list = new List<string>(); Console.ReadKey();
}
}
}
那么,给集合 list 增加一个项,用 Add() 方法
using System;
using System.Collections.Generic; namespace NetCore
{
class Program
{
//main中的代码
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=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
};
Console.ReadKey();
}
完整代码如下
using System;
using System.Collections.Generic; namespace NetCore
{
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=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
new Test{x=,y=},
};
Console.ReadKey();
}
}
}
由于类是引用类型,它的内存是引用地址,不像 int、char等类型,所以在对类(引用类型)使用数组、集合等形式时,可以用 “交错数组” 来理解。
最新文章
- c++单例模式为什么不在析构函数中释放静态的单例对象(转)
- 工厂模式模拟Spring的bean加载过程
- downsampling and upsampling【转】
- 【131031】asp.net <;%%>;&;<;%#%>;&;<;%=%>;&;<;%@%>;&;<;%$%>;用法区别
- 扩大View的点击范围
- Myeclipse 10 破解说明
- UVa 1252 Twenty Questions (状压DP+记忆化搜索)
- bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配
- vue开发环境搭建及热更新
- 通过Performance Log确定磁盘有性能问题?
- Linux中SVN的备份与恢复
- 从硬件竞争到软实力PK——电视媒体竞争观察
- 王之泰201771010131《面向对象程序设计(java)》第十三周学习总结
- 完成一个Laravel项目的过程
- Idea构建maven项目
- centos 升级python3
- 将一个xml文件解析到一个list中
- 【mybatis基础】mybatis开发dao两种方法
- 正确理解web交互中的cookie与session
- goldengate 过滤对某张表的复制操作
热门文章
- Spring通过配置类加载实体bean
- sudo: /usr/lib/sudo/sudoers.so must be only be writable by owner
- ETL DAG调度策略
- javascript 初探
- 给大家推荐一个nginx.conf文件格式生成的网站
- 用Python玩转微信
- Java多线程编程核心技术-第2章-对象及变量的并发访问-读书笔记
- windows 上robot framework 读取sqlite3提示:OperationalError: unable to open database file错误
- css 布局 一中一右
- CCF虚拟现实与可视化技术专委会丨面向增强现实的可视计算技术研究进展概述