C# 数组

  • 数组

    数组是一种数据结构,可以存储相同类型的元素的固定大小的顺序集合。数组用于存储数据集合,但是将数组视为相同类型的变量集合通常会更有用。无需声明单个变量(例如,number0,number1,...和number99),而是声明一个数组变量(例如,numbers),并使用numbers [0],numbers [1]和...,numbers [99]表示各个变量。数组中的特定元素由索引访问。所有数组均包含连续的内存位置。最低地址对应于第一个元素,最高地址对应于最后一个元素。
    images
  • 声明数组

    在要在C#中声明数组,程序员可以指定元素的类型和数组所需的元素数量,如下所示-
    
    datatype[] arrayName;
    
    说明
    • 数据类型用于指定数组中元素的类型。
    • []指定数组的等级。等级指定数组的大小。
    • arrayName指定数组的名称。
    例如
    
    double[] balance;
    
  • 初始化数组

    声明数组不会初始化内存中的数组。初始化数组变量后,可以为数组分配值。数组是引用类型,因此您需要使用new关键字创建数组的实例。例如,
    
    double[] balance = new double[10];
    
  • 将值分配给数组

    您可以使用索引号将值分配给各个数组元素,例如-
    
    double[] balance = new double[10];
    balance[0] = 4500.0;
    
    您可以在声明时将值分配给数组,如下所示:
    
    double[] balance = { 2340.0, 4523.69, 3421.0};
    
    您还可以创建和初始化数组,如下所示:
    
    int [] marks = new int[5]  { 99,  98, 92, 97, 95};
    
    您也可以省略数组的大小,如下所示:
    
    int [] marks = new int[]  { 99,  98, 92, 97, 95};
    
    您可以将一个数组变量复制到另一个目标数组变量中。在这种情况下,目标和源都指向相同的存储位置-
    
    int [] marks = new int[]  { 99,  98, 92, 97, 95};
    int[] score = marks;
    
    创建数组时,C#编译器会根据数组类型将每个数组元素隐式初始化为默认值。例如,对于一个int数组,所有元素都初始化为0。
  • 访问数组元素

    通过索引数组名称来访问元素。这是通过将元素的索引放在数组名称后面的方括号内来完成的。例如-
    
    double salary = balance[9];
    
    以下示例演示了上述概念的声明,赋值和访问数组-
    
    using System;
    
    namespace ArrayApplication {
       class MyArray {
          static void Main(string[] args) {
             int []  n = new int[10]; /* n is an array of 10 integers */
             int i,j;
    
             /* initialize elements of array n */
             for ( i = 0; i < 10; i++ ) {
                n[ i ] = i + 100;
             }
             
             /* output each array element's value */
             for (j = 0; j < 10; j++ ) {
                Console.WriteLine("Element[{0}] = {1}", j, n[j]);
             }
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
  • 使用 foreach 循环

    在前面的示例中,我们使用了for循环来访问每个数组元素。您也可以使用foreach语句遍历数组。
    
    using System;
    
    namespace ArrayApplication {
       class MyArray {
          static void Main(string[] args) {
             int []  n = new int[10]; /* n is an array of 10 integers */
             
             /* initialize elements of array n */
             for ( int i = 0; i < 10; i++ ) {
                n[i] = i + 100;
             }
             
             /* output each array element's value */
             foreach (int j in n ) {
                int i = j-100;
                Console.WriteLine("Element[{0}] = {1}", i, j);
             }
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
  • 数组详细知识

    数组对C#很重要,应该多加注意。C# 程序员应该清楚以下与数组有关的重要概念-
    多维数组 - C#支持多维数组。多维数组的最简单形式是二维数组。
    声明:
    
    string [,] names;
    
    或int变量的3维数组,如-
    
    int [ , , ] m;
    
    多维数组的最简单形式是二维数组。二维数组是一维数组的列表。二维数组可以看作是一个表,该表具有x的行数和y的列数。以下是一个二维数组,其中包含3行4列
    images
    因此,数组a中的每个元素都由a [i,j]形式的元素名称标识,其中a是数组的名称,而i和j是唯一标识数组a中每个元素的下标。
    初始化二维数组
    可以通过为每行指定括号中的值来初始化多维数组。以下数组具有3行,每行有4列。
    
    int [,] a = new int [3,4] {
       {0, 1, 2, 3} ,   /*  initializers for row indexed by 0 */
       {4, 5, 6, 7} ,   /*  initializers for row indexed by 1 */
       {8, 9, 10, 11}   /*  initializers for row indexed by 2 */
    };
    
    使用下标访问二维数组中的元素。也就是说,数组的行索引和列索引。例如,
    
    int val = a[2,3];
    
    上面的语句从数组的第三行获取第四元素。您可以在上图中进行验证。让我们检查程序来处理二维数组-
    
    using System;
    
    namespace ArrayApplication {
       class MyArray {
          static void Main(string[] args) {
             /* an array with 5 rows and 2 columns*/
             int[,] a = new int[5, 2] {{0,0}, {1,2}, {2,4}, {3,6}, {4,8} };
             int i, j;
             
             /* output each array element's value */
             for (i = 0; i < 5; i++) {
                
                for (j = 0; j < 2; j++) {
                   Console.WriteLine("a[{0},{1}] = {2}", i, j, a[i,j]);
                }
             }
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
    锯齿状数组
    锯齿状数组是数组的数组。您可以将一个名为scores的锯齿状数组声明为int类型-
    
    int [][] scores;
    
    声明一个数组,不会在内存中创建该数组。创建上面的数组-
    
    int[][] scores = new int[5][];
    for (int i = 0; i < scores.Length; i++) {
       scores[i] = new int[4];
    }
    
    您可以将锯齿状数组初始化为-
    
    int[][] scores = new int[2][]{new int[]{92,93,94},new int[]{85,66,87,88}};
    
    其中,scores是两个整数数组的数组-scores [0]是3个整数的数组,scores [1]是4个整数的数组。
    以下示例说明了使用锯齿状数组-
    
    using System;
    
    namespace ArrayApplication {
       class MyArray {
          static void Main(string[] args) {
             
             /* a jagged array of 5 array of integers*/
             int[][] a = new int[][]{new int[]{0,0},new int[]{1,2},
                new int[]{2,4},new int[]{ 3, 6 }, new int[]{ 4, 8 } };
             int i, j;
             
             /* output each array element's value */
             for (i = 0; i < 5; i++) {
                for (j = 0; j < 2; j++) {
                   Console.WriteLine("a[{0}][{1}] = {2}", i, j, a[i][j]);
                }
             }
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
    将数组传递给函数
    您可以在C#中将数组作为函数参数传递。以下示例演示了这一点-
    
    using System;
    
    namespace ArrayApplication {
       class MyArray {
          double getAverage(int[] arr, int size) {
             int i;
             double avg;
             int sum = 0;
             
             for (i = 0; i < size; ++i) {
                sum += arr[i];
             }
             avg = (double)sum / size;
             return avg;
          }
          static void Main(string[] args) {
             MyArray app = new MyArray();
             
             /* an int array with 5 elements */
             int [] balance = new int[]{1000, 2, 3, 17, 50};
             double avg;
    
             /* pass pointer to the array as an argument */
             avg = app.getAverage(balance, 5 ) ;
    
             /* output the returned value */
             Console.WriteLine( "Average value is: {0} ", avg );
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
    参数数组
    有时,在声明方法时,您不确定作为参数传递的参数数量。C#参数数组(或参数数组)在这种时候会有所帮助。
    以下示例演示了这一点-
     
    using System;
    
    namespace ArrayApplication {
       class ParamArray {
          public int AddElements(params int[] arr) {
             int sum = 0;
             
             foreach (int i in arr) {
                sum += i;
             }
             return sum;
          }
       }
       class TestClass {
          static void Main(string[] args) {
             ParamArray app = new ParamArray();
             int sum = app.AddElements(512, 720, 250, 567, 889);
             
             Console.WriteLine("The sum is: {0}", sum);
             Console.ReadKey();
          }
       }
    }
    
    尝试一下
    数组类
    Array类是 C# 中所有数组的基类。它在系统名称空间中定义。Array类提供了与数组一起使用的各种属性和方法。
    下表描述了Array类的一些最常用的属性-
    属性 描述
    IsFixedSize 获取一个值,该值指示Array是否具有固定大小。
    IsReadOnly 获取一个值,该值指示Array是否为只读。
    Length 获取一个32位整数,该整数表示Array所有维度中的元素总数。
    LongLength 获取一个64位整数,该整数表示Array所有维度中的元素总数。
    Rank 获取数组的等级(维数)。
    数组类的方法
    方法 描述
    Clear 根据元素类型,将Array中的元素范围设置为零,false或null。
    Copy(Array, Array, Int32) 从第一个元素开始的数组中复制一系列元素,并将其粘贴到从第一个元素开始的另一个Array中。长度指定为32位整数。
    CopyTo(Array, Int32) 从指定的目标数组索引开始,将当前一维数组的所有元素复制到指定的一维数组。索引被指定为32位整数。
    GetLength 获取一个32位整数,该整数表示Array指定维中的元素数。
    GetLongLength 获取一个64位整数,该整数表示Array指定维中的元素数。
    GetLowerBound 获取数组中指定维的下限。
    GetType 获取当前实例的类型。 (继承自Object。)
    GetUpperBound 获取数组中指定维的上限。
    GetValue(Int32) 获取一维数组中指定位置的值。索引被指定为32位整数。
    IndexOf(Array, Object) 搜索指定的对象,并返回整个一维Array中第一次出现的索引。
    Reverse(Array) 反转整个一维数组中元素的顺序。
    SetValue(Object, Int32) 为一维数组中指定位置的元素设置一个值。索引被指定为32位整数。
    Sort(Array) 使用Array每个元素的IComparable实现对整个一维Array中的元素进行排序。
    ToString 返回表示当前对象的字符串。 (继承自Object。)
    有关Array类属性和方法的完整列表,请查阅有关 C# 的Microsoft文档。
    要记住的第二点是C不主张将局部变量的地址返回到函数外部,因此您必须将局部变量定义为静态变量。 现在,考虑以下函数,该函数将生成10个随机数并使用数组返回它们,并按如下所示调用此函数:
    
    using System;
    
    namespace ArrayApplication {
       class MyArray {
          static void Main(string[] args) {
             int[] list = { 34, 72, 13, 44, 25, 30, 10 };
             int[] temp = list;
             Console.Write("Original Array: ");
             
             foreach (int i in list) {
                Console.Write(i + " ");
             }
             Console.WriteLine();
             
             // reverse the array
             Array.Reverse(temp);
             Console.Write("Reversed Array: ");
             
             foreach (int i in temp) {
                Console.Write(i + " ");
             }
             Console.WriteLine();
             
             //sort the array
             Array.Sort(list);
             Console.Write("Sorted Array: ");
             
             foreach (int i in list) {
                Console.Write(i + " ");
             }
             Console.WriteLine();
             Console.ReadKey();
          }
       }
    }
    
    尝试一下