(九)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单组请添加图片描述
交错:◾ 多维度◾ 子数组的长度可以不同多个多组🚫请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/28671.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算字母出现次数【存在括号计算】

计算字母出现次数【存在括号计算】 此代码考虑到了本问题的大多可能情况&#xff0c;闲话少述&#xff0c;代码中的注释很丰富。 代码绝对可以解决你的问题&#xff01; 不行你就评论&#xff0c;回复速度超快 作者时间YaoChongChong2023年6月14日10&#xff1a;40 Descript…

【gcc, cmake, eigen, opencv,ubuntu】五.CMakeLists.txt编写

文章目录 CMakeLists.txt编写1.CMakeLists.txt模板2.设置编程语言版本3.设置编译类型Debug&#xff0c;Release4.设置获取文件列表5.添加include目录6.配置编译选项 CMakeLists.txt编写 1.CMakeLists.txt模板 一个使用opencv 的 CMakeLists.txt # cmake最低版本要求 cmake_m…

该怎么学Python?自学Python的方法和资料整理!

导语 Python 作为一门简洁、易学且功能强大的编程语言&#xff0c;备受程序员和初学者的喜爱。如果你也想学习 Python&#xff0c;但不知从何入手&#xff0c;本文将为你整理一些自学 Python 的方法&#xff0c;助你快速入门并掌握这门语言。 为什么学习Python&#xff1f;&a…

requests库的使用

文章目录 get 请求post 请求get 请求和 post 请求的区别response1. res.headers2. status_code3. json get 请求 参数类型作用urlstr发起请求的地址params字典url为基准地址&#xff0c;不包含查询参数&#xff1b;使用此参数会自动对 params 字典编码&#xff0c;然后和url拼…

函数参数的拓展

函数参数的默认值 C 中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供默认参数的值&#xff0c;则使用默认值 参数的默认值必须在函数声明中指定 当函数声明时没有出现参数的默认值&#xff0c;而定义的时候出现参数的默认值&#xff0c;编译器会报错 当函数声…

看了这几个C语言例子,你一定和我一样连说5个卧槽,声音一次比一次大

曾经我一直以为自己C语言学的还挺好的&#xff0c;直到看到这几个例子。 例1 首先来看一下&#xff0c;大师是如何求圆周率的&#xff0c;一口君实在词穷&#xff0c;first卧槽。 #include <stdio.h>long a10000,b0,c10000,d,e,f[10001],g;void main(){for(;b ! c; f[…

nginx的安装及代理和负载均衡设置

一、通过yum方式进行安装 官网参考地址&#xff1a;https://nginx.org/en/linux_packages.html#RHEL 1.1 安装好依赖 执行下面的命令安装 sudo yum install yum-utils1.2、 先配置好yum源 新建文件/etc/yum.repos.d/nginx.repo&#xff0c;文件内容&#xff1a; [nginx-s…

Spark SQL数据源:Hive表

文章目录 一、Spark SQL支持读写Hive二、Spark配置hive-site.xml三、准备工作&#xff08;一&#xff09;启动Hive的metastore&#xff08;二&#xff09;启动Spark Shell 四、Spark读写Hive数据&#xff08;一&#xff09;导入SparkSession&#xff08;二&#xff09;创建Spar…

内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 )

内网安全&#xff1a;Cobalt Strike 与 MSF 联动&#xff08; 会话 相互转移 &#xff09; 在渗透中&#xff0c;有时候 Cobalt Strike 会话可能会受限制&#xff0c;所以我们需要把 Cobalt Strike 会话转移到 MSF 上进行后面的渗透。也有的时候会话在 MSF 上&#xff0c;但是…

MySQL数据库的认识及基础命令操作

目录 一、数据库的基本概念 1、数据库定义 &#xff08;1&#xff09; 数据 &#xff08;2&#xff09;表 &#xff08;3&#xff09; 数据库 2、 数据库管理系统&#xff08;DBMS&#xff09; 3、 数据库系统&#xff08;DBS&#xff09; 二、数据库系统发展史 1、 第一…

编程必备:JAVA多线程详解

目录 前言 1.入门多线程 1.1. 线程、进程、多线程、线程池 1.2.并发、串行、并行 1.3. 线程的实现方式 1.3.1. 继承 Thread 类 1.3.2. 实现 Runnable 接口 1.3.3. 使用 Callable 和 Future 1.3.4. 使用线程池 1.4.线程的状态 1.5. 线程常用方法 1.5.1 sleep() 1.4…

docker 网络理论知识点 - CNM 和命名空间

Network 目录 1 network namespace1.1 动手小实验 2 回到 docker2.1 driver and docker02.2 network2.3 网桥 docker0 3 总结 1 network namespace 1.1 动手小实验 网络命名空间。linux kernel 提供的网络虚拟化的功能。创建多个隔离的网络空间。每个空间内 firewall, ether …

【taro react】---- 解决H5接入uni-app版本的IM

1. 问题 由于项目开发比较紧张&#xff0c;腾讯 IM 的接入就使用了 TUIKit 含UI集成方案&#xff0c;遇到的问题&#xff0c;uni-app的UI本来就是一个单独的项目&#xff0c;需要集成到现有的 Taro React 中&#xff0c;就只能作为一个独立的项目&#xff0c;不跳转时不影响原有…

在十四届蓝桥杯开赛前一星期开始复习

文章目录 十三届蓝桥杯国赛原题1.20222.钟表3卡牌4最大数字4.5 Dijkstra算法5出差 十三届蓝桥杯国赛原题 1.2022 #include<iostream> using namespace std;long long int f[2023][11][2023]; //表示前2022个物品选择10个物品&#xff0c;体积总和为2022的方案个数 ,,数…

入门编程其实也简单

随着信息技术的快速发展&#xff0c;编程已经成为一个越来越重要的技能。那么&#xff0c;我们该如何入门编程呢&#xff1f; 编程是指使用计算机语言编写计算机程序的过程。计算机程序是一系列指令的集合&#xff0c;这些指令告诉计算机要执行的操作。编程的目的是创建计算机…

Unity编辑器扩展-第二集-按钮排序/分组/放入右键菜单

第一集链接&#xff1a;Unity编辑器扩展-第一集-在菜单栏加入自己的按钮_菌菌巧乐兹的博客-CSDN博客 一、本节目标效果展示 1.按钮排序 变成 2.按钮分组 仔细看&#xff0c;有个灰色的杠杠 3.放入右键菜单 4.皮一下 二、按钮排序具体流程 第一集讲&#xff0c;如果想放入…

阿里云PAIx达摩院GraphScope开源基于PyTorch的GPU加速分布式GNN框架

作者&#xff1a;艾宝乐 导读 近期阿里云机器学习平台 PAI 团队和达摩院 GraphScope 团队联合推出了面向 PyTorch 的 GPU 加速分布式 GNN 框架 GraphLearn-for-PyTorch(GLT) 。GLT 利用 GPU 的强大并行计算性能来加速图采样&#xff0c;并利用 UVA 来减少顶点和边特征的转换和…

4.4.2 译码器

1. 学习基础知识&#xff1a;首先&#xff0c;我会了解译码器的基本概念、原理和应用。通过阅读教科书、参考资料或在线资源&#xff0c;我会学习译码器的工作原理、不同类型的译码器以及它们在电子系统中的应用场景。 2. 研究示例和练习题&#xff1a;为了更好地理解译码器的…

【Spring】透过Spring源码查看Bean的命名转换规则

近期在写Spring项目的时候&#xff0c;需要通过注解的形式去替代之前直接将Bean存放在Spring容器这种方式&#xff0c;以此来简化对于Bean对象的操作&#xff0c;但是这样无法通过准确的Id去获取到相应的Bean对象了 测试观察 首先&#xff0c;如果要将指定的对象存放到Spring中…

Unity入门6——光源组件

一、参数面板 二、参数介绍 Type&#xff1a;光源类型 Spot&#xff1a;聚光灯 Range&#xff1a;发光距离Spot Angle&#xff1a;光锥角度Directional&#xff1a;方向光Point&#xff1a;点光源Area&#xff08;Baked Only&#xff09;&#xff1a;面光源 仅烘焙。预先算好&…
最新文章