(九)CSharp-数组

一、矩形数组

1、访问数组元素

  class Program
    {
        static void Main(string[] args)
        {
            int[] intArr1 = new int[15];
            intArr1[2] = 10;
            int var1 = intArr1[2];

            int[,] intArr2 = new int[5, 10];
            intArr2[2, 3] = 7;
            int var2 = intArr2[2, 3];

            int[] myIntArray = new int[4];

            for (int i = 0; i < 4; i++)
                myIntArray[i] = i * 10;

            for (int i = 0; i < 4; i++)
                Console.WriteLine($"Value of element{ i } = { myIntArray[i] }");

            Console.ReadKey();
        }
    }

2、初始化

1)显式初始化一维数组

int[] intArr = new int[]{ 10,20,30,40 };

2)显式初始化矩形数组

int[,] intArray2 = new int[,]{ { 10,1},{ 2,10 },{ 11,9 } };

3)初始化矩形数组的语法点

int[,,] intArray = new int[4,3,2]{
{ { 8,6 },{ 8,6 },{ 8,6 } },
{ { 8,6 },{ 8,6 },{ 8,6 } },
{ { 8,6 },{ 8,6 },{ 8,6 } },
{ { 8,6 },{ 8,6 },{ 8,6 } },
};

4)快捷语法

//arr1 和 arr2 等价
int[] arr1 = new int[3]{ 10,20,30 };
int[] arr2 = { 10,20,30 };

//arr3 和 arr4 等价
int[,] arr3 = new int[2,3]{ { 0,1,2 }, { 0,1,2 } };
int[,] arr4 = { { 0,1,2 }, { 0,1,2 } };

3、隐式类型数组

int[] intArr1 = new int[] { 10,20,30,40 };int[]:显式
var intArr2 = new [] { 10,20,30,40 };//隐式定义

int[,] intArr3 = new int[,] { { 10,1 },{ 10,1 },{ 10,1 } } ;
var intArr2 = new    [,] { { 10,1 },{ 10,1 },{ 10,1 } } ;

atring[] sArr1 = new string[] { "life", "liberty","pureuit of happiness" };
var      sArr2 = new       [] { "life","liberty" ,"pureuit of happiness"}
//

二、交错数组

交错数组是数组的数组。交错数组的子数组的元素个数可以不同。

int[][] jagArr = new int[3][];

//比如:
//jagArr[0][x]:子数组有x个元素
//agArr[1][y]:子数组有y个元素
//agArr[2][x]:子数组有z个元素

1、声明交错数组

int [][] SomeArr;//秩等于3
int [][][] OtherArr; //秩等于3

2、快捷实例化

声明:

int[][] jagArr = new int[3][];

不能在声明语句中初始化顶层数组之外的数组。

int[][] jagArr = new int[3][4];//编译错误

//声明初始化时,如果把[3][]设置为[3][4],则设置子数组为4是不被允许的。

3、实例化交错数组

class Program
    {
        static void Main(string[] args)
        {
            int[][,] Arr;
            Arr = new int[3][,];

            Arr[0] = new int[,] {   { 1, 2 }, { 10, 20 }   };

            Arr[1] = new int[,] {   { 1, 2 ,3}, { 10, 20,30 }   };

            Arr[2] = new int[,] {   { 1, 2,3,4 }, { 10, 20,30,40 }, { 100, 200, 300, 400 }   };

            //Arr.GetLength(0):获取 Arr 维度0的长度(维度是数组的层级)
            //Arr.GetLength(0) 是 int[3][x,y] 中的 3
            for (int i = 0; i < Arr.GetLength(0); i++)
            {
                //Arr[i].GetLength(0):获取 Arr[i] 维度0的长度
                //Arr[i].GetLength(0) 是 int[3][x,y] 中的 x
                for (int j = 0; j < Arr[i].GetLength(0); j++)
                {
                    //Arr[i].GetLength(1):获取 Arr[i] 维度1的长度
                    //Arr[i].GetLength(1) 是 int[3][x,y] 中的 y
                    for (int k = 0; k < Arr[i].GetLength(1); k++)
                    {
                        Console.WriteLine($"[{i}][{j},{k}] = { Arr[i][j,k] }");
                    }
                    Console.WriteLine("");

                }
                Console.WriteLine("");

            }

            Console.ReadKey();
        }
    }

输出结果:

[0][0,0] = 1
[0][0,1] = 2

[0][1,0] = 10
[0][1,1] = 20


[1][0,0] = 1
[1][0,1] = 2
[1][0,2] = 3

[1][1,0] = 10
[1][1,1] = 20
[1][1,2] = 30


[2][0,0] = 1
[2][0,1] = 2
[2][0,2] = 3
[2][0,3] = 4

[2][1,0] = 10
[2][1,1] = 20
[2][1,2] = 30
[2][1,3] = 40

[2][2,0] = 100
[2][2,1] = 200
[2][2,2] = 300
[2][2,3] = 400

4、比较矩形数组和交错数组

请添加图片描述

在 CIL中(中间语言),存在对一维数组进行性能优化的指令,而矩形数组没有这些指令。

四、foreach

1、迭代变量

由于迭代变量的值是只读的,所以它不能改变。

foreach(int item in arr1)
//item 是迭代变量

对值类型数组:

int arr1 = { 10,11,12,13 };

foreach(int item in arr1)
{
item++;//编译错误,不能改变 item 值
}

对引用类型数组:

MyClass[] mcArray = new MyClass[4];

foreach(int item in arr1)
{
item.MyField;//可以改变引用类型对象里的成员
item = null;//编译错误,不能改变 item 值。
}

2、foreach 语句和多维数组

示例

   class Program
    {
        static void Main(string[] args)
        {
            //矩形数组的示例
            int[,] arr1 = { { 10, 11 }, { 12, 13 } };

            foreach (var element in arr1)
            {
                //....
            }

            //交错数组的示例
            int[][] arr2 = new int[2][];
            arr2[0] = new int[] { 10, 11 };
            arr2[1] = new int[] { 12, 13, 14 };

            foreach (int[] array in arr2)
            {
                foreach (int item in array)
                {
                    //....
                }

            }
            Console.ReadKey();
        }
    }

五、数组协变

在某些情况下,即使某个对象不是数组的基类型,也可以把它赋值给数组元素。这种属性叫作数组协变。

可进行数组协变的条件:

  • 数组是引用类型数组。
  • 在赋值的对象类型和数组基类型之间有隐式转换或显式转换。
class A { }
    class B : A { }

    class Program
    {
        static void Main(string[] args)
        {
            A[] AArray1 = new A[3];
            A[] AArray2 = new A[3];

            AArray2[0] = new B();//产生协变
            AArray2[1] = new B();//产生协变
            AArray2[2] = new B();//产生协变
            Console.ReadKey();
        }
    }

请添加图片描述

六、数组继承的有用成员

1、数组基类继承的属性和方法

C# 数组派生自 System.Array 类。它们可以从基类继承很多有用的属性和方法。

表-数组继承的一些有用成员

成员类 型生存期意义
Rank属性实例获取数组的维度数
Length属性实例获取数组中所有维度的元素总数目
Getlength方法实例返回数组的指定维度的长度
Clear方法静态将某一范围内的元素设置为 0 或null
Sort方法静态在一维数组中对元素进行排序
BinarySearch方法静态使用二进制搜索,搜索一维数组中的值
Clone方法实例进行数组的浅复制——对于值类型数组和引用类型数组,都只复制元素
IndexOf方法静态返回一维数组中遇到的第一个值
Reverse方法静态反转一维数组中某一范围内的元素
GetUpperBound方法实例获取指定维度的上限

使用其中一些属性和方法的例子:

   class Program
    {
        public static void PrintArray(int[] a)
        {
            foreach (var x in a)
                Console.Write($"{ x }  ");

            Console.WriteLine("");
        }

        static void Main(string[] args)
        {
            int[] arr = new int[] { 15, 20, 5, 25, 10 };
            PrintArray(arr);

            Array.Sort(arr);
            PrintArray(arr);

            Array.Reverse(arr);
            PrintArray(arr);

            Console.WriteLine();
            Console.WriteLine($"Rank = { arr.Rank },Length = { arr.Length }");
            Console.WriteLine($"GetLength()     = { arr.GetLength(0) }");
            Console.WriteLine($"GetType()       = { arr.GetType() }");

            Console.ReadKey();
        }
    }

输出结果:

15 20 5 25 10
5 10 15 20 25
25 20 15 10 5
.
Rank = 1,Length = 5
GetLength() = 5
GetType() = System.Int32[]

2、Clone() 方法

Clone 方法为数组进行浅复制,它只创建了数组本身的克隆。

  • 克隆值类型数组会产生两个独立数组。
  • 克隆引用类型数组会产生指向相同对象的两个数组。
int[] intArr1 = { 1,2,3 };
int[] intArr2 = (int[]) intArr1.Clone();
//int[]:数组类型
//Clone():返回 object

3、比较数组类型

表总结了3种类型的数组的重要相似点和不同点——比较数组类型的总结。

数组类型数组对象语法语法形状
一维: ◾ 在CIL 中有优化指令1单组🚫请添加图片描述
矩形:◾ 多维度◾ 多维数组中的子数组必须长度相同1单组请添加图片描述
交错:◾ 多维度◾ 子数组的长度可以不同多个多组🚫请添加图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值