• Array:一组数据的有序集合


    数组是一种数据结构,它包含若干相同类型的变量。数组的定义是:在内存中连续开辟的空间,该空间中存储着一组相同数据类型的值。

    数组具有以下属性:

    数组可以是一维、多维或交错的。

    数值数组元素的默认值设置为零,而引用元素的默认值设置为 null。

    交错数组是数组的数组,因此,它的元素是引用类型,初始化为 null。

    数组的索引从零开始:具有 n 个元素的数组的索引是从 0 到 n-1。

    数组元素可以是任何类型,包括数组类型。

    数组的声明是使用“[]”对数据类型修饰,并在声明的同时,告诉编译器,我们需要在内存中开辟的空间可以存储多少个值。数组中的值,我们称为数组的元素。

    int[] iarr=new int[6];

    上述就是一个整型数组的声明。int[]告诉编译器,我们声明一个整数数组,该数组中只能存储整型值。iarr是变量名称。new int[6]就是告诉编译器,我们需要在内存中开辟的空间能存储6个整型值。

    数组的大小一旦被定义后,就不可以再被更改。同时编译器为数组中的每一个元素依次配给一个标记,该标记叫下标。你可以想象下酒店的情况,在一层楼上有20个房间,每个房间都有一个门牌号,房间一旦完成隔离就不可以再更改了,除非这层楼全面重新设计布局。

    数组的下标是从0开始分配的,这个和我们平常的生活有所不同,我们的门牌号大多都是1开始计数,初学者必须要习惯C#喜欢从0开始计数的怪异脾气。所以下标的最大值总要比数组中元素的总数小1。

    对数组中具体的元素的访问,我们必须通过下标实现:

    static void Main(string[] args)

    {

    int[] iarr = new int[6];

    iarr[0] = 2;

    iarr[1] = 23;

    iarr[2] = 4;

    iarr[3] = 2;

    iarr[4] = 7;

    iarr[5] = 10;

    System.Console.WriteLine(iarr[4]); //输出下标为4的元素的值

    }

    运行的结果如图3.1.1。

    clip_image002

    图3.1.1 显示数组中指定的元素值

    我们也可以在声明的时候为数组的每一个元素赋值,如果使用这种模式,就不必再显示的描述元素的个数,编译器能推测出元素的个数。

    static void Main(string[] args)

    {

    int[] iarr = new int[] { 2, 23, 4, 2, 7, 10 };

    System.Console.WriteLine(iarr[4]); //输出下标为4的元素的值

    }

    数组是连续分配的空间,下标的分配也是连续的,从上述代码我们可以发现使用迭代循环是访问数组的好方法。

    static void Main(string[] args)

    {

    int[] iarr = new int[] { 2, 23, 4, 2, 7, 10 };

    for (int i = 0; i <= iarr.Length - 1; i++)

    {

    System.Console.WriteLine(iarr[i]);

    }

    }

    Length是数组的属性,该属性能告诉我们当前数组声明的元素个数。上述代码的输出结果如图3.1.2。

    clip_image004

    图3.1.2遍历数据中的每一个元素

    虽然说,数组的定义是在内存中连续分配的空间,但是在 C# 中,数组实际上是对象,而不只是像 C 和 C++ 中那样的可寻址连续内存区域。Array 是所有数组类型的抽象基类型,可以使用 Array 具有的属性以及其他类成员。比如使用Array数组可以非常方便的对数组类型的值进行排序。

    static void Main(string[] args)

    {

    int[] iarr = new int[6];

    iarr[0] = 2;

    iarr[1] = 23;

    iarr[2] = 4;

    iarr[3] = 2;

    iarr[4] = 7;

    iarr[5] = 10;

    Array.Sort(iarr); //升序排序

    for (int i = 0; i <= iarr.Length - 1; i++)

    {

    System.Console.WriteLine(iarr[i]);

    }

    }

    排序后的输出结果如图3.1.3。

    clip_image006

    图3.1.3 Sort结果

    C#没有提供降序的排序方法,不过呢,C#提供了一种方式将数组中的值反转它们的顺序。

    static void Main(string[] args)

    {

    int[] iarr = new int[6];

    iarr[0] = 2;

    iarr[1] = 23;

    iarr[2] = 4;

    iarr[3] = 2;

    iarr[4] = 7;

    iarr[5] = 10;

    Array.Reverse(iarr); //反转数组中元素的顺序

    for (int i = 0; i <= iarr.Length - 1; i++)

    {

    System.Console.WriteLine(iarr[i]);

    }

    }

    上述代码的结果如图3.1.4。

    clip_image008

    图3.1.4 Reverse结果

    可以观察Sort和Reverse的结果。如果你有足够的联想力的话,也许你会想到以下的代码来解决降序的排序方案:

    static void Main(string[] args)

    {

    int[] iarr = new int[6];

    iarr[0] = 2;

    iarr[1] = 23;

    iarr[2] = 4;

    iarr[3] = 2;

    iarr[4] = 7;

    iarr[5] = 10;

    Array.Sort(iarr); //升序排序

    Array.Reverse(iarr); //反转数组中元素的顺序

    for (int i = 0; i <= iarr.Length - 1; i++)

    {

    System.Console.WriteLine(iarr[i]);

    }

    }

    以下就是数组中元素降序排序的结果,如图3.1.5所示。

    clip_image010

    图3.1.5 降序排序结果

    如果我们需要了解某一个值是否在数组的一系列元素中存在,我们不必遍历数组中的每一个元素,C#的数组类提供了IndexOf方法,该方法返回指定的元素值在数组中第一次出现的下标位置,如果该值不存在,则返回-1。下面的代码描述了如何使用IndexOf方法查找数组中元素的值。

    static void Main(string[] args)

    {

    int[] iarr = new int[6];

    iarr[0] = 2;

    iarr[1] = 23;

    iarr[2] = 4;

    iarr[3] = 2;

    iarr[4] = 7;

    iarr[5] = 10;

    System.Console.WriteLine(Array.IndexOf(iarr, 7));

    System.Console.WriteLine(Array.IndexOf(iarr, 20));

    }

    得到的结果如图3.1.6。

    clip_image012

    图3.1.6 IndesOf结果

    如果我们使用目前的所有知识来模拟IndexOf的方法,大致的代码如下:

    static void Main(string[] args)

    {

    int[] iarr = new int[6];

    iarr[0] = 2;

    iarr[1] = 23;

    iarr[2] = 4;

    iarr[3] = 2;

    iarr[4] = 7;

    iarr[5] = 10;

    System.Console.WriteLine(MyIndexOf(iarr,7));

    System.Console.WriteLine(MyIndexOf(iarr,20));

    }

    public static int MyIndexOf(int[] iarr, int value)

    {

    for (int i = 0; i <= iarr.Length - 1; i++)

    {

    if (iarr[i] == value)

    {

    return i;

    }

    }

    return -1;

    }

    我们自己编写的MyIndexOf方法的执行模式的效果和Array的IndexOf方法是一致的。当然我们可以编写LastIndexOf方法,代码的实现如下:

    public static int MyLastIndexOf(int[] iarr, int value)

    {

    int index = -1;

    for (int i = 0; i <= iarr.Length - 1; i++)

    {

    if (iarr[i] == value)

    {

    index = i; ;

    }

    }

    return index; ;

    }

    如果可以的话,你还可以编写的函数看看自己是否能灵活运用。

    public static int MyIndexOf(int[] iarr, int value, int start, int end)

    {

    end = end < iarr.Length ? end : iarr.Length;

    for (int i = start; i < end; i++)

    {

    if (iarr[i] == value)

    {

    return i;

    }

    }

    return -1;

    }

    初学者注意

    使用自己的编程知识,模拟.NET Framework提供的方法,是一种很有效的学习方法。

  • 相关阅读:
    Container Attached Storage: A primer
    1.3-Air302(NB-IOT)-新建lua文件和lua文件的变量,函数调用
    STM32+ESP8266+AIR202/302基本控制篇-114-功能测试-APP扫码绑定Air302(NB-IOT),并通过MQTT和Air302(NB-IOT)实现远程通信控制
    1.2-Air302(NB-IOT)-刷固件,下载和运行第一个lua程序
    1.1-Air302(NB-IOT)-硬件使用说明
    006-STM32+ESP8266+AIR202/302基本控制方案(阿里云物联网平台)-阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信
    004-在阿里云物联网平台上动态注册设备(基于Android)
    30-STM32+W5500+AIR202基本控制篇-功能优化-MQTT服务器配置SSL单向认证(Linux系统)
    30-STM32+W5500+AIR202基本控制篇-功能优化-MQTT服务器配置SSL单向认证(.Windows系统)
    数据处理思想和程序架构: 单片机stm32的flash保存数据优化方案(让擦写次数达到上百万至上千万次)
  • 原文地址:https://www.cnblogs.com/shyleoking/p/1535459.html
Copyright © 2020-2023  润新知