【笔记】C#一维数组、多维数组和交错数组的区别

简介: 自行整理的C#数组区别笔记。

@[TOC]

前言

😄大家好,我是writer桑, 这是自己整理的 C# 数组笔记,方便自己学习的同时分享出来,感谢支持。

数组的概念

数组表示可以将同一类型的多个变量存储在一个数组的数据结构,同时分配指定的数组元素类型来声明数据元素的类型。

示例如下:

// 声明一个5个整数的一维数组。
int[] array1 = new int[5];

// 声明和设置数组元素值。
int[] array2 = new int[] { 1, 3, 5, 7, 9 };

// 替代语法 
int[] array3 = { 1, 2, 3, 4, 5, 6 };

//声明一个二维数组。
int[,] multiDimensionalArray1 = new int[2, 3];

// 声明和设置数组元素值。
int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } };

// 声明一个交错数组。
int[][] jaggedArray = new int[6][];

// 声明交错数组结构中第一个数组的值。 
jaggedArray[0] = new int[4] { 1, 2, 3, 4 };
  • 数组可以是一维、多维或者交错的,三者的区别在于声明数组的维度上
  • 数组元素的默认值设置为零,而引用元素设置为 null,声明后的数组在生存期内无法被更改
  • 数组元素可以通过索引进行访问,包含 n 个元素的数组的索引为 0 到 n-1
  • 数组类型是从抽象的基类型 Array 派生的引用类型,数组元素可以是任何类型,其中包括本身的数组类型
  • 所有数组都实现了 IList 和 IEnumerable,可以使用 foreach 语句循环访问数组和 Length 属性输出数组的长度。 单维数组还实现了 IList\<T> 和 IEnumerable\<T>

1,一维数组:

一维数组也是最简单、最常用的数组。在 C# 程序中使用 new 运算符实现一维数组,同时指定数组元素类型和元素数量。

示例如下:

// 声明一个元素数量为5的整数数组 
int[] array1 = new int[] { 1, 3, 5, 7, 9 };

// 声明字符串数组 
string[] weekDays = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

// 可以省略 new 表达式和数组类型, 称为隐式类型化数组
int[] array2 = { 1, 3, 5, 7, 9 };
string[] weekDays2 = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

// 如果声明数组但未创建数组变量,则必须在引用该数组之前使用 new 运算符分配新数组 
int[] array3;
array3 = new int[] { 1, 3, 5, 7, 9 }; 

2,多维数组:

多维数组表示在一维数组的基础上增加了维度,多维数组在声明和访问元素的方式和一维数组不同,但在实现和属性上跟一维数组没有本质的区别, 一维数组支持的操作多维数组也都支持。

示例如下:

// 二维数组 
int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

// 指定了维度的相同数组。
int[,] array2Da = new int[4, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };

// 带有字符串元素的多维数组。 
string[,] array2Db = new string[3, 2] 
{ 
    {"one", "two" }, 
    { "three", "four"},
    { "five", "six" } 
};
        
// 三维数组 
int[,,] array3D = new int[,,] 
{ 
    { { 1, 2, 3 }, { 4, 5, 6 } },
    { { 7, 8, 9 }, { 10, 11, 12 } } 
};

// 指定了维度的相同数组。 
int[,,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } },{ { 7, 8, 9 }, { 10, 11, 12 } } };
        
// 输出数组元素 
Console.WriteLine(array2D[0, 0]);
Console.WriteLine(array2D[0, 1]);
Console.WriteLine(array2D[1, 0]);
Console.WriteLine(array2D[1, 1]);
Console.WriteLine(array2D[3, 0]);
Console.WriteLine(array2Db[1, 0]);
Console.WriteLine(array3Da[1, 0, 1]);
Console.WriteLine(array3D[1, 1, 2]);

3,交错数组:

交错数组也是一个数组,但数组元素也是数组,元素大小可以不同。交错数组称为是数组的数组,因此其元素为引用类型且被初始化为 null。在交错数组中可以混用交错数组和多维数组,所以在声明和访问元素的方式上和一维、多维数组不同。
using System; 

class ArrayTest
{
    static void Main()
    {
        // 声明包含两个元素的交错数组,并初始化元素 
        int[][] arr = new int[][]
        {
            new int[5] { 1, 3, 5, 7, 9 },
            new int[4] { 2, 4, 6, 8 }
        };
        

        // 循环语句输出数组 
        for (int i = 0; i < arr.Length; i++)
        {
            Console.Write("Element({0}): ", i);
            for (int j = 0; j < arr[i].Length; j++)
            {
                Console.Write("{0}{1}", arr[i][j], j ==
                   (arr[i].Length - 1) ? "" : " ");
            }

            Console.WriteLine();
        }
       
    }
}

/* 输出
 Element(0): 1 3 5 7 9
 Element(1): 2 4 6 8
*/ 

区别总结

一维数组和多维数组的区别:多维数组是对一维数组下标访问的一种改变, 例如 int[,] array2D = { { 1, 2 }, { 3, 4 } }; 等价于 int[] array2 = { 1, 2, 3, 4 };当以1为基准,二维数组arr2[][]和一维数组arr1[]的下标访问转换符合: arr2i = arr1[(i - 1) n - i (i - 1) / 2 + j - i];编译器会自动采用这种算法。

交错数组和一维、多维数组的区别:交错数组本质也是数组,只不过区别于其它数组的是交错数组的每个元素又是一个数组,也就是数组里面再嵌套数组这种逻辑。


结语

✔️ 以上就是 C# 中一维、多维及交错数组的区别总结,希望能够对大家有所帮助。望大家多多支持,你们的支持就是笔者创作最大的动力!
目录
相关文章
|
3月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
88 2
|
1月前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
50 7
|
2月前
|
网络协议 网络性能优化 C#
C# 一分钟浅谈:UDP 与 TCP 协议区别
【10月更文挑战第8天】在网络编程中,传输层协议的选择对应用程序的性能和可靠性至关重要。本文介绍了 TCP 和 UDP 两种常用协议的基础概念、区别及应用场景,并通过 C# 代码示例详细说明了如何处理常见的问题和易错点。TCP 适用于需要可靠传输和顺序保证的场景,而 UDP 适用于对延迟敏感且可以容忍一定数据丢失的实时应用。
52 1
|
1月前
|
开发框架 安全 .NET
C#面:Server.UrlEncode、HttpUtility.UrlDecode的区别
通过上述详细的解释和实例分析,相信大家对 `Server.UrlEncode` 和 `HttpUtility.UrlDecode` 的区别有了更深刻的理解,并能在实际开发中灵活运用。
43 0
|
2月前
|
C# 开发者
【捞底干货】C#中equals和==运算符的区别
【捞底干货】C#中equals和==运算符的区别
74 1
|
2月前
|
算法 安全 测试技术
C#——刘铁猛笔记
C#——刘铁猛笔记
55 0
|
3月前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
138 5
|
4月前
|
C#
C#中的overload,overwrite,override的语义区别
以上概念是面向对象编程中实现多态性和继承的重要基石。理解它们之间的区别对于编写清晰、可维护的代码至关重要。
146 7
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
36 3
|
4天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
31 12