数组(array)是将一组类型相同的数据进行统一组织、管理和使用的一种形式,定义和初始化一个数组时,需要指定数据成员的数据类型及成员数量,如下面的代码就定义了一个包含10个int数据的数组。

int[] arr = new int[10];

使用数组时,还需要注意一点,其索引值是从0开始的,也就是说,定义了10个成员的数组,其成员索引值是从0到9,如下面的代码,我们通过一个for循环结构分别给arr数组成员赋值。

static void Main(string[] args)
{
        int[] arr = new int[10];
        for (int i = 0; i < 10; i++)
        {
            arr[i] = (int)Math.Pow(2, i);
        }
        // 显示数据
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine(arr[i]);
        }
}

代码中将索引值也当做指数,分别计算了2的0到9次方的结果,执行结果如下图所示。

enter image description here

实际应用中,如果数组的成员是已知的或没有规律的,也可以在定义数组时直接指定成员的值,如下面的代码。

static void Main(string[] args)
{
        int[] arr = { 1, 1, 2, 3, 5 };
        // 显示数据
        foreach(int n in arr)
        {
            Console.WriteLine(n);
        }
}

本例中,我们使用一对花括号直接指定了数组成员的数组;而对于成员数量不明确的数组,则可以使用foreach...in语句结构访问其成员,如代码中那样,其执行结果如下图所示。

enter image description here

大家可以看到,数组的应用,可以通过循环语句结构很方便的访问成员,也可以对其成员进行相同或相似的操作;对于大量相关的数据操作,使用数组是非常方便的,下面,我们将了解更多关于数组的操作。

多维数组

多维数组可以处理如二维矩阵、三维矩阵此类的数据,如下面的代码就定义了一个3行4列的二维矩阵。

static void Main(string[] args)
{
        int[,] matrix = new int[3,4];
        // 
        for(int row=0;row<3;row++)
        {
            for(int col=0;col<4;col++)
            {
                Console.Write(" ({0},{1})", row, col);
            }
            Console.WriteLine();
        }
}

代码执行结果如下图所示。

enter image description here

直接指定多维数组成员的数据时,注意维度的处理,如下面的代码同样是定义了一个二矩阵数据结构。

static void Main(string[] args)
{
        int[,] matrix = {
            { 1,2,3,4},
            {5,6,7,8 },
            {9,10,11,12 }
        };
        // 
        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 4; col++)
            {
                Console.Write(" ({0}) ", matrix[row, col]);
            }
            Console.WriteLine();
        }
}

代码执行结果如下图所示。

enter image description here

这里,我们只讨论了二维数组的应用,实际开发中,维度增加时,数据处理的复杂程度会呈几何级增长,所以,如果应用中需要处理多维数据,应注意数据结构的合理设计,使用循环语句结构访问数组成员时,循环控制变量一定要直观,如示例中的row表示行、col表示列等。

Array类

实际上,我们定义的每一个数组都会映射为Array对象,这样一来,我们就可以使用Array类中定义的一系列成员来操作数组,如排序、反转、获取数据维数和成员数量等,下面的代码演示了Array类中几个成员的使用。

static void Main(string[] args)
{
        int[,] matrix = {
            { 1,2,3,4},
            {5,6,7,8 },
            {9,10,11,12 }
        };
        Console.WriteLine("数组成员数量:{0}", matrix.Length);
        Console.WriteLine("数组的维度:{0}", matrix.Rank);
        Console.WriteLine("数组第一维的成员数量:{0}", matrix.GetLength(0));
}

代码执行结果如下图所示。

enter image description here

本例中,我们使用了Array类的三个成员,分别是:

  • Length属性,返回数组成员的数量,请注意,这里是所有的成员,不考虑维度问题。此外,如果成员数量真的很多,还可以使用LongLength属性获取。
  • Rank属性,返回数组的维度。
  • GetLength()方法,返回指定维度的成员数量,请注意,第一维索引也是从0开始的。

关于Array类的更多操作,大家可帮助Microsoft的帮助文档。

自定义索引器

前面的内容都使用了从0开始的整数索引来访问数组成员,实际上,我们还可以在自己的类型中定义索引形式,这就是使用索引器(indexer)。

下面的代码,我们创建CFibonacci类,用于计算斐波那契数列。

namespace ConsoleTest
{
    public class CFibonacci
    {
        public int this[int n]
        {
            get
            {
                if (n == 1 || n == 2)
                {
                    return 1;
                }
                else if (n > 2)
                {
                    int x = 1, y = 1;
                    int tmp = 0;
                    for (int i = 3; i <= n; i++)
                    {
                        tmp = x;
                        x = y;
                        y += tmp;
                    }
                    return y;
                }
                else
                {
                    return 0;
                }
            }
        }
    }
}

本例中,我们在CFibonacci类中定义了一个索引器,大家可看到,索引器没有名称,而是使用this关键字,而索引器的索引数据使用一对方括号定义。这里定义的索引器的功能就是用于返回斐波那契数列的第n个数据,下面的代码测试了此类的应用。

static void Main(string[] args)
{
        CFibonacci fib = new CFibonacci();
        for(int i=1;i<=10;i++)
        {
            Console.WriteLine(fib[i]);
        }
}

代码用于显示斐波那契数列的前10个数字,执行结果如下图所示。

enter image description here

实际上,本例的执行效率并不高,大家可以思考一下为什么?

问题就出在每次计算第n个数值时都会从第1个开始计算,如果需要从1到开始的连续数据,其效率并不高,下面,我们在CFibonacci类中添加GetSeq()方法,其功能是给出数列的前n个数值,并返回一个数组。

public int[] GetSeq(int n)
{
        if (n < 1) return new int[0];
        //
        int[] re = new int[n];
        re[0] = 1;
        if (n > 1) re[1] = 1;
        //
        if(n>2)
        {
            for(int i=2;i<n;i++)
            {
                re[i] = re[i - 2] +re[i - 1];
            }
        }
        return re;
}

下面的代码测试了GetSeq()方法的使用。

static void Main(string[] args)
{
        CFibonacci fib = new CFibonacci();
        int[] arr = fib.GetSeq(10);
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine(arr[i]);
        }
}

代码执行结果如下图所示。

enter image description here

实际应用中,索引数据还可以是其它类型的数据,如字符串类型,后续的学习中可以看到相关的应用。

CHY软件小屋原创作品!