C#快速入門教程(19)—— 索引器與陣列

曹化宇發表於2018-10-15

陣列(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軟體小屋原創作品!

相關文章