C#多维数组 交错数组的区别,即[ , ]与[ ] [ ]的区别

简介: C#多维数组 交错数组的区别,即[ , ]与[ ] [ ]的区别

多维数组的声明


在声明时,必须指定数组的长度,格式为 type [lenght ,lenght ,lengh, ... ]


1

int[,] test1 = newint[3,3];


 或声明时即赋值,由系统推断长度


1

2

3

4

5

int[,] test1 = {

            {1,2,3},

            {1,2,3},

            {1,2,3},

        };


交错数组的声明


声明时,至少需要指定第一维的长度,格式为 type [ ] [ ] [ ] ...


1

int[][] test1 = newint[5][]; int[][] test1 = newint[][];    //注意,此的声明方式是错的


或者声明时即赋值,由系统推断长度 


1

2

3

4

5

int[][] test1 = {

    newint[] {1,2,3,4},

    newint[] {1,2,3},

    newint[] {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 = {

          newint[] {1,2,3,4},     //new int[4] {1,2,3,4}

          newint[] {1,2,3},      //new int[3] {1,2,3}

          newint[] {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 = {

     newint[] {1,2,3},

     newint[] {1,2,3},

     newint[] {1,2,3},

 };

 Console.WriteLine(test1.Length);   <br>输出为 3

 

方法


多维数组、交错数组的方法无差别,都具有Sort()、Clear()等方法,这里不再赘述,关于数组的高级用法,请查阅

https://www.jb51.net/Special/265.htm

 

下列为System.Array类的属性


微信图片_20220426103406.png


由于系统提供的方法比较多,有兴趣请查阅

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等类型,所以在对类(引用类型)使用数组、集合等形式时,可以用 “交错数组” 来理解。

相关文章
|
2月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
81 2
|
11天前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
35 7
|
14天前
|
开发框架 安全 .NET
C#面:Server.UrlEncode、HttpUtility.UrlDecode的区别
通过上述详细的解释和实例分析,相信大家对 `Server.UrlEncode` 和 `HttpUtility.UrlDecode` 的区别有了更深刻的理解,并能在实际开发中灵活运用。
25 0
|
1月前
|
网络协议 网络性能优化 C#
C# 一分钟浅谈:UDP 与 TCP 协议区别
【10月更文挑战第8天】在网络编程中,传输层协议的选择对应用程序的性能和可靠性至关重要。本文介绍了 TCP 和 UDP 两种常用协议的基础概念、区别及应用场景,并通过 C# 代码示例详细说明了如何处理常见的问题和易错点。TCP 适用于需要可靠传输和顺序保证的场景,而 UDP 适用于对延迟敏感且可以容忍一定数据丢失的实时应用。
35 1
|
5月前
|
存储 安全 Java
程序与技术分享:C#值类型和引用类型的区别
程序与技术分享:C#值类型和引用类型的区别
44 0
|
1月前
|
C# 开发者
【捞底干货】C#中equals和==运算符的区别
【捞底干货】C#中equals和==运算符的区别
28 1
|
2月前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
118 5
|
3月前
|
C#
C#中的overload,overwrite,override的语义区别
以上概念是面向对象编程中实现多态性和继承的重要基石。理解它们之间的区别对于编写清晰、可维护的代码至关重要。
128 7
|
5月前
|
存储 开发框架 .NET
C#中的数组探索
C#中的数组探索
|
6月前
|
C#
c#一文读懂continue、return、break区别
c#一文读懂continue、return、break区别
54 0