7.4 数组的基本操作

视频讲解:光盘\TM\lx\7\04数组的基本操作.mp4

C#中的数组是由System.Array类派生而来的引用对象,因此可以使用Array类中的各种方法对数组进行各种操作。本节将对数组的常用操作进行详细讲解。

7.4.1 遍历数组

遍历数组就是获取数组中的每个元素,C#中,可以使用foreach语句实现数组的遍历功能。

【例7.10】下面创建一个int类型的一维数组,该数组中包含10个元素,然后使用foreach语句遍历该数组中的元素,代码如下。

        int[] arr = new int[10] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
        //采用foreach语句对arr数组进行遍历
        foreach(int number inarr)
            Console.WriteLine(number);
        Console.ReadLine();

程序运行结果:

        10
        20
        30
        40
        50
        60
        70
        80
        90
        100

7.4.2 添加/删除数组元素

1.添加数组元素

添加数组元素有两种情况:一是在数组中添加一个元素,二是在数组中添加一个数组,下面通过实例分别对这两种情况进行介绍。

【例7.11】创建一个控制台应用程序,首先自定义一个AddArray方法,用来在指定索引号的后面添加元素,并返回新得到的数组;然后在Main方法中调用该自定义方法,向指定的一维数组中添加元素。代码如下。(实例位置:光盘\TM\sl\7\3)

        /// <summary>
        ///增加单个数组元素
        /// </summary>
        /// <param name="ArrayBorn">要向其中添加元素的一维数组</param>
        /// <param name="Index">添加索引</param>
        /// <param name="Value">添加值</param>
        /// <returns></returns>
        static int[] AddArray(int[] ArrayBorn, int Index, int Value)
          {
            if (Index>=(ArrayBorn.Length))                        //判断添加索引是否大于数组的长度
                Index=ArrayBorn.Length-1;                         //将添加索引设置为数组的最大索引
            int[] TemArray=new int[ArrayBorn.Length+1];           //声明一个新的数组
            for (int i=0; i<TemArray.Length; i++)                 //遍历新数组的元素
            {
                if (Index>=0)                                     //判断添加索引是否大于等于0
                {
                  if (i<(Index+1))                                //判断遍历到的索引是否小于添加索引加1
                      TemArray[i]=ArrayBorn[i];                   //交换元素值
                  else if (i==(Index+1))                          //判断遍历到的索引是否等于添加索引加1
                      TemArray[i]=Value;                          //为遍历到的索引设置添加值
                  else
                      TemArray[i]=ArrayBorn[i-1];                 //交换元素值
                }
                else
                {
                  if (i==0)                                       //判断遍历到的索引是否为0
                      TemArray[i]=Value;                          //为遍历到的索引设置添加值
                  else
                      TemArray[i]=ArrayBorn[i-1];                 //交换元素值
                }
            }
            return TemArray;                                      //返回插入元素后的新数组
        }
        static void Main(string[] args)
        {
            int[] ArrayInt=new int[]{0, 1, 2, 3, 4, 6, 7, 8, 9};  //声明一个一维数组
            Console.WriteLine("原数组元素:");
            foreach (int i in ArrayInt)                           //遍历声明的一维数组
                Console.Write(i+" ");                             //输出数组中的元素
            Console.WriteLine();                                  //换行
            ArrayInt=AddArray(ArrayInt, 4, 5);                    //调用自定义方法向数组中插入单个元素
            Console.WriteLine("插入之后的数组元素:");
            foreach (int i in ArrayInt)                           //遍历插入元素后的一维数组
                Console.Write(i+" ");                             //输出数组中的元素
            Console.ReadLine();
        }

程序运行结果如图7.7所示。

图7.7 向数组中添加元素

【例7.12】创建一个控制台应用程序,首先自定义一个AddArray方法,用来在指定索引号的后面添加一个数组,并返回新得到的数组;然后在Main方法中调用该自定义方法,向指定的一维数组中添加一个数组。代码如下。(实例位置:光盘\TM\sl\7\4)

    /// <summary>
    ///向一维数组中添加一个数组
    /// </summary>
    /// <param name="ArrayBorn">源数组</param>
    /// <param name="ArrayAdd">要添加的数组</param>
    /// <param name="Index">添加索引</param>
    /// <returns>新得到的数组</returns>
    static int[] AddArray(int[] ArrayBorn, int[] ArrayAdd, int Index)
    {
        if (Index>=(ArrayBorn.Length))                     //判断添加索引是否大于数组的长度
          Index=ArrayBorn.Length-1;                        //将添加索引设置为数组的最大索引
        int[] TemArray = new int[ArrayBorn.Length + ArrayAdd.Length]; //声明一个新的数组
        for (int i=0; i<TemArray.Length; i++)              //遍历新数组的元素
        {
          if (Index>=0)                                    //判断添加索引是否大于等于0
          {
              if (i<(Index+1))                             //判断遍历到的索引是否小于添加索引加1
                  TemArray[i]=ArrayBorn[i];                //交换元素值
              else if (i==(Index+1))                       //判断遍历到的索引是否等于添加索引加1
              {
                  for (int j=0; j<ArrayAdd.Length; j++)    //遍历要添加的数组
                      TemArray[i+j]=ArrayAdd[j];           //为遍历到的索引设置添加值
                  i=i+ArrayAdd.Length-1;                   //将遍历索引设置为要添加数组的索引最大值
              }
              else
                  TemArray[i] = ArrayBorn[i - ArrayAdd.Length]; //交换元素值
          }
          else
          {
              if (i==0)                                    //判断遍历到的索引是否为0
              {
                  for (int j=0; j<ArrayAdd.Length; j++)    //遍历要添加的数组
                      TemArray[i+j]=ArrayAdd[j];           //为遍历到的索引设置添加值
                  i=i+ArrayAdd.Length-1;                   //将遍历索引设置为要添加数组的索引最大值
              }
              else
                  TemArray[i] = ArrayBorn[i - ArrayAdd.Length]; //交换元素值
          }
        }
        return TemArray;                                   //返回添加数组后的新数组
    }
    static void Main(string[] args)
    {
        int[] ArrayInt=new int[]{0, 1, 2, 3, 8, 9};        //声明一个数组,用来作为源数组
        int[] ArrayInt1=new int[]{4, 5, 6, 7};             //声明一个数组,用来作为要添加的数组
        Console.WriteLine("源数组:");
        foreach (int i in ArrayInt)                        //遍历源数组
          Console.Write(i+" ");                            //输出源数组元素
        Console.WriteLine();                               //换行
        Console.WriteLine("要添加的数组:");
        foreach (int i in ArrayInt1)                       //遍历要添加的数组
          Console.Write(i+" ");                            //输出要添加的数组中的元素
        Console.WriteLine();                               //换行
        ArrayInt=AddArray(ArrayInt, ArrayInt1, 3);         //向数组中添加数组
        Console.WriteLine("添加后的数组:");
        foreach (int i in ArrayInt)                        //遍历添加后的数组
            Console.Write(i+" ");                          //输出添加后的数组中的元素
        Console.ReadLine();
    }

程序运行结果如图7.8所示。

图7.8 向数组中添加数组

2.删除数组元素

删除数组元素主要有两种情况:一是在不改变数组元素总数的情况下删除指定元素(也就是用删除元素后面的元素覆盖要删除的元素);二是删除指定元素后,根据删除元素的个数n,使删除后的数组长度减n。下面通过实例分别对这两种情况进行介绍。

【例7.13】创建一个控制台应用程序,首先自定义一个DeleteArray方法,用来在不改变长度的情况下从数组的指定索引处删除指定长度的元素;然后在Main方法中调用该自定义方法,从指定的数组中删除一个元素。代码如下。(实例位置:光盘\TM\sl\7\5)

        /// <summary>
        ///删除数组中的元素
        /// </summary>
        /// <param name="ArrayBorn">要从中删除元素的数组</param>
        /// <param name="Index">删除索引</param>
        /// <param name="Len">删除的长度</param>
        static void DeleteArray(string[] ArrayBorn, int Index, int Len)
        {
            if (Len<=0)                                    //判断删除长度是否小于等于0
              return;                                      //返回
            if (Index==0&&Len>=ArrayBorn.Length)           //判断删除长度是否超出了数组范围
              Len=ArrayBorn.Length;                        //将删除长度设置为数组的长度
            else if ((Index+Len)>=ArrayBorn.Length)        //判断删除索引和长度的和是否超出了数组范围
              Len=ArrayBorn.Length-Index-1;                //设置删除的长度
            int i=0;                                       //定义一个int变量,用来标识开始遍历的位置
            for (i=0; i<ArrayBorn.Length-Index-Len; i++)   //遍历删除的长度
              ArrayBorn[i+Index]=ArrayBorn[i+Len+Index];   //覆盖要删除的值
            //遍历删除长度后面的数组元素值
            for (int j = (ArrayBorn.Length -1); j > (ArrayBorn.Length - Len -1); j--)
              ArrayBorn[j]=null;                           //设置数组为空
        }
        static void Main(string[] args)
        {
            string[] ArrayStr=new string[]{"m", "r", "s", "o", "f", "t"};  //声明一个字符串数组
            Console.WriteLine("源数组:");
            foreach (string i in ArrayStr)                  //遍历源数组
              Console.Write(i+" ");                         //输出数组中的元素
            Console.WriteLine();                            //换行
            DeleteArray(ArrayStr, 0, 1);                    //删除数组中的元素
            Console.WriteLine("删除元素后的数组:");
            foreach (string i in ArrayStr)                        //遍历删除元素后的数组
                Console.Write(i+" ");                          //输出数组中的元素
            Console.ReadLine();
        }

程序运行结果如图7.9所示。

图7.9 不改变长度删除数组中的元素

【例7.14】创建一个控制台应用程序,自定义方法ret_DeleteArray在删除元素或指定区域的元素后,改变数组的长度。代码如下。(实例位置:光盘\TM\sl\7\6)

        /// <summary>
        ///删除数组中的元素,并改变数组的长度
        /// </summary>
        /// <param name="ArrayBorn">要从中删除元素的数组</param>
        /// <param name="Index">删除索引</param>
        /// <param name="Len">删除的长度</param>
        /// <returns>得到的新数组</returns>
        static string[] DeleteArray(string[] ArrayBorn, int Index, int Len)
        {
            if (Len<=0)                                           //判断删除长度是否小于等于0
              return ArrayBorn;                                   //返回源数组
            if (Index==0&&Len>=ArrayBorn.Length)                  //判断删除长度是否超出了数组范围
              Len=ArrayBorn.Length;                               //将删除长度设置为数组的长度
            else if ((Index+Len)>=ArrayBorn.Length)               //判断删除索引和长度的和是否超出了数组范围
              Len=ArrayBorn.Length-Index-1;                       //设置删除的长度
            string[] temArray=new string[ArrayBorn.Length-Len];   //声明一个新的数组
            for (int i=0; i<temArray.Length; i++)                 //遍历新数组
            {
              if (i>=Index)                                       //判断遍历索引是否大于等于删除索引
                  temArray[i]=ArrayBorn[i+Len];                   //为遍历到的索引元素赋值
              else
                  temArray[i]=ArrayBorn[i];                       //为遍历到的索引元素赋值
            }
            return temArray;                                      //返回得到的新数组
        }
        static void Main(string[] args)
        {
            string[] ArrayStr=new string[]{"m", "r", "s", "o", "f", "t"};  //声明一个字符串数组
            Console.WriteLine("源数组:");
            foreach (string i in ArrayStr)                        //遍历源数组
              Console.Write(i+" ");                               //输出数组中的元素
            Console.WriteLine();                                  //换行
            string[] newArray=DeleteArray(ArrayStr, 0, 1);        //删除数组中的元素
            Console.WriteLine("删除元素后的数组:");
            foreach (string i in newArray)                        //遍历删除元素后的数组
                Console.Write(i+" ");                             //输出数组中的元素
            Console.ReadLine();
        }

程序运行结果如图7.10所示。

图7.10 改变长度删除数组中的元素

7.4.3 对数组进行排序

C#中提供了用于对数组进行排序的方法Array.Sort和Array. Reverse,其中,Array.Sort方法用于对一维Array数组中的元素进行排序,Array.Reverse方法用于反转一维Array数组或部分Array数组中元素的顺序。

【例7.15】下面使用Array.Sort方法对数组中的元素进行从小到大的排序,代码如下。

        int[] arr = new int[] { 3, 9, 27, 6, 18, 12, 21, 15 };
        Array.Sort(arr);                                 //对数组元素排序

注意 在Sort方法中所用到的数组不能为空,也不能是多维数组,它只对一维数组进行排序。

【例7.16】下面使用Array. Reverse方法对数组的元素进行反向排序,代码如下。

        int[] arr = new int[] { 3, 9, 27, 6, 18, 12, 21, 15 };
        Array. Reverse(arr);                             //对数组元素反向排序

7.4.4 数组的合并与拆分

数组的合并与拆分在很多情况下都会被应用,在对数组进行合并或拆分时,数组与数组之间的类型应一致。下面对数组的合并及拆分进行详细讲解。

1.数组的合并

数组的合并实际上就是将多个一维数组合并成一个一维数组,或者将多个一维数组合并成一个二维数组或多维数组。

注意 在合并数组时,如果是将两个一维数组合并成一个一维数组,那么新生成数组的元素个数必须为要合并的两个一维数组元素个数的和。

【例7.17】创建一个控制台应用程序,首先将两个一维数组合并成一个新的一维数组,然后再将定义的两个一维数组合并为一个新的二维数组。程序代码如下。(实例位置:光盘\TM\sl\7\7)

    static void Main(string[] args)
    {
        //定义两个一维数组
        int[] arr1 = new int[] { 1, 2, 3, 4, 5 };
        int[] arr2 = new int[] { 6, 7, 8, 9, 10 };
        int n = arr1.Length + arr2.Length;
        int[] arr3=new int[n];            //根据定义的两个一维数组的长度的和定义一个新的一维数组
        for (int i=0; i<arr3.Length; i++) //将定义的两个一维数组中的元素添加到新的一维数组中
        {
          if (i<arr1.Length)
              arr3[i]=arr1[i];
          eIse
              arr3[i]=arr2[i-arr1.Length];
        }
        Console.WriteLine("合并后的一维数组:");
        foreach (int i in arr3)
          Console.Write("{0}", i + " ");
        Console.WriteLine();
        int[, ] arr4=new int[2, 5];       //定义一个要合并的二维数组
        for (int i=0; i<arr4.Rank; i++)   //将两个一维数组循环添加到二维数组中
        {
          switch (i)
          {
              case 0:
                  {
                      for (int j=0; j<arr1.Length; j++)
                        arr4[i, j]=arr1[j];
                      break;
                  }
              case 1:
                  {
                      for (int j=0; j<arr2.Length; j++)
                        arr4[i, j]=arr2[j];
                      break;
                  }
          }
        }
        Console.WriteLine("合并后的二维数组:");
    for (int i=0; i<arr4.Rank; i++)         /显示合并后的二维数组
        {
          for (int j=0; j<arr4.GetUpperBound(arr4.Rank-1)+1; j++)
              Console.Write(arr4[i, j] + " ");
          Console.WriteLine();
        }
    }

按Ctrl+F5键查看运行结果,如图7.11所示。

2.数组的拆分

数组的拆分实际上就是将一个一维数组拆分成多个一维数组,或是将多维数组拆分成多个一维数组或多个多维数组。

【例7.18】创建一个控制台应用程序,将一个int类型的二维数组拆分成两个int类型的一维数组。程序代码如下。(实例位置:光盘\TM\sl\7\8)

        static void Main(string[] args)
        {
            int[,] arr1 = new int[2, 3] { { 1, 3, 5 }, { 2, 4, 6 } }; //定义一个二维数组,并赋值
            //定义两个一维数组,用来存储拆分的二维数组中的元素
            int[] arr2 = new int[3];
            int[] arr3 = new int[3];
            for (int i = 0; i < 2; i++)
            {
              for (int j = 0; j < 3; j++)
              {
                  switch (i)
                  {
                      case 0: arr2[j]=arr1[i, j]; break;              //判断如果是第一行中的元素,则添加到第一个中
                      case 1: arr3[j]=arr1[i, j]; break;              //判断如果是第二行中的元素,则添加到第二个中
                  }
              }
            }
            Console.WriteLine("数组一:");
            foreach(int n inarr2)                                     //输出拆分后的第一个一维数组
              Console.Write(n + " ");
            Console.WriteLine();
            Console.WriteLine("数组二:");                              //输出拆分后的第二个一维数组
            foreach(int n inarr3)
              Console.Write(n + " ");
            Console.WriteLine();
        }

按Ctrl+F5键查看运行结果,如图7.12所示。

图7.11 数组合并实例运行结果

图7.12 数组拆分实例运行结果