当前位置: 首页 > news >正文

C# 常用数据结构之数组Array

首先需要明确一个概念:在 C# 中,数组([])和 Array 是两个不同的东西,Array 是一个抽象类,而数组则是由 Array 派生出来的引用类型。

当然,通常将数组理解为 Array 也没太大问题,因为数组是可以使用 Array 的属性和方法的。

初始化

数组的初始化有以下三种方式:

1、以数组类型的默认值对数组元素进行初始化

int[] intArray = new int[3];  // 0 0 0
string[] strArray = new string[3];  // null null null
bool[] boolArray = new bool[3];  // False False False (打印的时候,bool值类型转为string类型,会自动大写首字母)

ps

默认值:值类型:0,引用类型:null,bool值:false

2、声明数组的时候进对数组元素行初始化

int[] intArray1 = new int[3] {1, 2, 3};  // 1 2 3
// 简略写法一:可以省略长度说明符,因为可以根据初始化列表中的元素数量推断出数组的长度
int[] intArray2 = new int[] {4, 5, 6};  // 4 5 6
// 简略写法二:可以省略 new 表达式和数组类型(这种写法称为"隐式类型化数组")
int[] intArray3 = {7, 8, 9};  // 7 8 9

3、先声明数组,再使用 new 进行初始化

int[] intArray;
intArray = new int[] {1, 2, 3};  // 1 2 3
// intArray = {1, 2, 3};  // Error,使用这种方式进行初始化,必须使用 new 运算符向此变量分配新数组

特性

1、数组中元素的类型必须是相同的

int[] intArray = new int[] {1, 2, 3};  // 1 2 3
// string[] strArray = new string[] {"a", 1, "b"};  // Error

ps

- 数组元素可以是任意类型,但一个数组中的所有元素都必须是数组声明时所指定的类型;

- 如果希望数组存储任意类型的元素,可将其类型指定为 object。在 C# 的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从 Object 继承的。

object[] objArray = new object[] {1, "a", true};  // 1 a True

2、数组长度固定,且初始化的时候必须指定长度

可以从上面的初始化方式看到,无论使用哪种方式进行初始化,编译器都可以获取到数组的长度。

由于数组的长度是固定的,所以数组并没有增删操作,但是可以进行改查。

修改数组中元素的值:

int[] intArray = new int[] {1, 2, 3};
intArray[0] = 666;
intArray[1] = 888;
intArray[2] = 999;
foreach (int i in intArray)
{
    Console.Write(i + " ");
}
// 666 888 999

3、数组元素在内存(托管堆)上的存储是连续的

因为数组元素在内存中是连续的,所以可以使用下标(从0开始,长度为n的数组,下标为0~n-1)直接访问,改查速度非常快。

4、数组可以作为参数(实参)传递给方法形参

由于数组是引用类型,因此方法可以更改数组元素的值:

string[] strArray = new string[] {"Hello", "World"};  // Hello World
changeElement(strArray, 1, "fightsyj");
void changeElement(string[] arr, int idx, string newValue)
{
    arr[idx] = newValue;
}
foreach (string str in strArray)
{
    Console.Write(str + " ");
}
// Hello fightsyj

多维数组

二维数组

int[,] array2D = new int[,] {
    { 1, 2 },
    { 3, 4 },
    { 5, 6 },
    { 7, 8 }
};  // 1 2 3 4 5 6 7 8
array2D[0, 1] = 666;
array2D[1, 0] = 888;
array2D[3, 1] = 999;
foreach (int i in array2D)
{
    Console.Write(i + " ");
}
// 1 666 888 4 5 6 7 999

三维数组

int[,,] array3D = new int[,,] {
    {
        { 1, 2, 3 },
        { 4, 5, 6 }
    },
    {
        { 7, 8, 9 },
        { 10, 11, 12 }
    }
};  // 1 2 3 4 5 6 7 8 9 10 11 12
array3D[0, 0, 1] = 666;
array3D[0, 1, 0] = 888;
array3D[1, 1, 2] = 999;
foreach (int i in array3D)
{
    Console.Write(i + " ");
}
// 1 666 3 888 5 6 7 8 9 10 11 999

交错数组

交错数组是元素为数组的数组,交错数组元素的维度和大小可以不同。

可以简单理解为多为数组的形状必定是规则的,而交错数组的形状不一定是规则的:

交错数组中元素个数不一致的那一维度在声明的时候不能指定长度!

int[][] jaggedArray = new int[][] {  // 这里可以可以使用 [][] 或者 [4][],由于第二维数组的元素个数不一致,所以第二个 [] 必须是空的
    new int[] {1, 2},
    new int[] {3, 4, 5},
    new int[] {6},
    new int[] {7, 8}
};  // 1 2 3 4 5 6 7 8
jaggedArray[0][1] = 666;
jaggedArray[1][2] = 888;
jaggedArray[3][1] = 999;
for (int i = 0; i < jaggedArray.Length; i++)
{
    for (int j = 0; j < jaggedArray[i].Length; j++)
    {
        Console.Write(jaggedArray[i][j] + " ");
    }
}
// 1 666 3 4 888 6 7 999

Array中常用的属性和方法

属性

Length:获取 Array 的所有维度中的元素总数

Rank:获取 Array 的秩(维数)。 例如,一维数组返回 1,二维数组返回 2,依次类推

int[] intArray = new int[] {1, 2, 3};
string[,] strArray = new string[,] {
    {"a", "b", "c"},
    {"d", "e", "f"}
};
Console.WriteLine("intArray: Length = {0} Rank = {1}", intArray.Length, intArray.Rank);  // intArray: Length = 3 Rank = 1
Console.WriteLine("strArray: Length = {0} Rank = {1}", strArray.Length, strArray.Rank);  // strArray: Length = 6 Rank = 2

方法

SetValue(Object, Int32):将值设置为一维 Array 中指定位置的元素。 索引指定为 32 位整数。

GetValue(Int32):获取一维 Array 中指定位置的值。 索引指定为 32 位整数。

IndexOf(Array, Object):在一个一维数组中搜索指定对象,并返回其首个匹配项的索引。

Reverse(Array):反转整个一维 Array 中元素的顺序。

int[] intArray = new int[] {1, 2, 3};
intArray.SetValue(666, 0);  // 666 2 3
Console.WriteLine("下标为0的值为:{0}", intArray.GetValue(0));  // 下标为0的值为:666
Console.WriteLine("值为2的下标为:{0}", Array.IndexOf(intArray, 2));  // 值为2的下标为:1
Array.Reverse(intArray);  // 3 2 666

Sort(Array):使用 Array 中每个元素的 IComparable 实现,对整个一维 Array 中的元素进行排序。

  • Array.Sort() 默认升序;
  • Array.Sort() 仅支持一维数组;
  • Array.Sort() 方法会直接修改原数组。
int[] intArray = new int[] {33, 55, 22, 11, 44};
Array.Sort(intArray);  // 11 22 33 44 55

参考:

数组(C# 编程指南)

Array 类

C# 数组(Array)

相关文章:

  • IT管理“十大失误”及其对策
  • C# 常用数据结构之列表List<T>
  • 组织之间的关系就好像是个大家庭
  • C# 常用数据结构之字典Dictionary<TKey,TValue>
  • 领导作为“先知者”需知的九大管理之道
  • C# 列表List<T>排序整理
  • 企业在经营时 要为自己“挖一口井”
  • C# 字典Dictionary<TKey,TValue>排序整理
  • 协同软件市场一盘散沙 春种能否秋收心中没底
  • bat 与或非
  • 独立软件开发商,出路何在?
  • Lua实战之不使用循环逆序输出一个数组
  • VS Code快速生成C#注释头
  • 10个装机最贵与免费的十大软件下载
  • VS 和 VS Code 更换字体
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Java面向对象及其三大特征
  • jQuery(一)
  • python 装饰器(一)
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Windows Containers 大冒险: 容器网络
  • 闭包--闭包作用之保存(一)
  • 回顾2016
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端面试总结(at, md)
  • 我的业余项目总结
  • 移动端解决方案学习记录
  • 《码出高效》学习笔记与书中错误记录
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # C++之functional库用法整理
  • #Linux(Source Insight安装及工程建立)
  • #WEB前端(HTML属性)
  • $.ajax中的eval及dataType
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (day 12)JavaScript学习笔记(数组3)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (十八)三元表达式和列表解析
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .gitignore文件设置了忽略但不生效
  • .Net FrameWork总结
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • ::前边啥也没有
  • @ComponentScan比较
  • @Transaction注解失效的几种场景(附有示例代码)
  • [android] 切换界面的通用处理
  • [Angular] 笔记 20:NgContent
  • [echarts] y轴不显示0
  • [hdu 3065] 病毒侵袭持续中 [AC自动机] [病毒特征码匹配]
  • [HNOI2015]实验比较
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [LeetCode]-225. 用队列实现栈
  • [LeetCode]—Permutations II 求全排列(有重复值)