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

内容纲要

多维数组的声明

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

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

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

int [,] test1 = {
            {1,2,3},
            {1,2,3},
            {1,2,3},
        };

交错数组的声明

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

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

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

        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] 是错误的;

下面以代码形式说明

大小不一致的多维数组会发生错误

int [,] test1 = {
            {1,2,3,4},
            {1,2,3},
            {1,2}
        };         //这样是错的,长度必须一致

int [,] test1 = new int [4,5] {
            {1,2,3,4,5},
            {1,2,3},
            {1,2,3}
        };        //这样也是错误的,长度必须一致,必须为每一个位置赋值

            这一点C#与C语言有所区别,C语言可以不全赋值,没有赋值的位置系统默认为0。

下面的方法是正确的

int [,] test1 = {
            {1,2,3},
            {1,2,3},
            {1,2,3}
        };

  初始化交错数组

上面已经说了声明一个交错数组的方法

  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 获取数组的长度,需要注意的是,多维数组的长度是每一维相乘,即元素总个数。

 

        int [,] test1 = {
            {1,2,3},
            {1,2,3},
            {1,2,3}
        };
        Console.WriteLine(test1.Length);
 输出为   9

 

而交错数组的长度则是“内部组成的数组的个数”,例如

 

       int [][] test1 = {
            new int[] {1,2,3},
            new int[] {1,2,3},
            new int[] {1,2,3},
        };
        Console.WriteLine(test1.Length);   
输出为 3

 

方法

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

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

 

下列为System.Array类的属性

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

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

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

 

点赞
  1. order doxepin说道:

    I simply wished to thank you very much yet again. I do not know what I would have undertaken without these thoughts shared by you regarding this subject matter. It was before the scary scenario in my position, nevertheless taking note of this specialized tactic you solved the issue took me to weep with happiness. Now i'm thankful for your support and thus trust you really know what an amazing job you were putting in training the mediocre ones via your webpage. Most probably you haven't met any of us.

  2. risnia说道:

    A lot of thanks for all your efforts on this site. Gloria loves engaging in investigation and it's easy to understand why. Almost all know all concerning the dynamic means you give helpful items on the web blog and as well encourage contribution from others on that concern plus our daughter is actually discovering a lot. Have fun with the remaining portion of the new year. You're the one conducting a good job.

发表评论

邮箱地址不会被公开。 必填项已用*标注

You must enable javascript to see captcha here!