官术网_书友最值得收藏!

5章 數組處理

數組同上一章講的字符串一樣,也是C#數據處理方面的一個基礎內容。數組是一種基本的數據類型,和其他類型(比如int型、float型、double型、string型等)的區別是它能存儲一組數據,而非單個數據。這個性質使得數組的應用十分廣泛。

5.1 創建數組

同其他數據類型一樣,數組的創建也十分容易,示例代碼如下所示。

        byte[] a = new byte[5];

上面的代碼是建立一個名為a,長度為5的byte型一維數組。如果要訪問該數組,用a[i]進行訪問,數組的元素索引應該從0開始。也就是說,要訪問數組的第一個元素用a[0],訪問最后一個用a[4]。數組的類型可以是C#中的任意基本類型,如int型、byte型、char型、double型、float型、string型等。下面舉個簡單的例子。

打開VS2008,在D:\C#\ch5目錄下建立一個名為arrayCreateTest的控制臺應用程序。在Main()函數里添加如下代碼。

        int[] a1 = new int[10];
        string[] a2 = new string[10];
        for (int i = 0; i < 10; i++)
          {
            a1[i] = i;
            a2[i] = a1[i].ToString();           //轉化為string型從控制臺輸出
            Console.Write(a2[i] + " ");
          }
        Console.ReadKey();

該段代碼實現的功能是先對一個整型數組賦值,然后將其轉化為string型從控制臺輸出。運行結果如圖5-1所示。

圖5-1 運行結果

在上例中對數組的定義是先給其分配內存空間,然后再進行賦值。也可以采用數組的另一種初始化方式,在定義的時候同時賦值,如下所示。

        int[] s = new int[5] { 1, 2, 3, 4, 5 };

下面接著介紹二維數組及多維數組,先看一個簡單二維數組的定義。

        double[, ] d = new double[2, 3];

二維數組的初始化和一維數組一樣,除了先聲明,后賦值外,也可以在聲明的同時進行賦值,如下所示。

        double[, ] d = new double[, ] { {2,2}, {3,3}, {4,4}, {5,5}};   //聲明一個4行2
                                                                //列的二維數組并賦值

5.2 多維數組

在實際的數據處理中,三維數組就基本能處理所有問題。在此,舉一個三維數組的例子并說明foreach關鍵字在數組處理中的應用。

打開VS2008,在D:\C#\ch5目錄下建立一個名為mArrayTest的控制臺應用程序。在Main()函數中添加如下代碼。

        int[, , ] s = new int[3, 3, 3];
        for (int i = 0; i < 3; i++)    //通過三個for循環對該三維數組進行賦值
          {
              for (int j = 0; j < 3; j++)
                {
                  for (int m = 0; m < 3; m++)
                      {
                      s[i, j, m] = i + j + m;
                      }
                }
            }
        foreach (int k in s)            //用foreach輸出數組中的所有元素到控制臺顯示
          {
              Console.Write(k.ToString()+" ");
          }
        Console.ReadKey();

運行結果如圖5-2所示。

圖5-2 運行結果

上例中,對聲明的三維數組進行初始化,并運用foreach關鍵字將三維數組中的全部元素輸出到控制臺。介紹完一維數組和多維數組后,下面接著介紹數組中的一個靈活點——動態數組。

5.3 動態數組

在數組的使用過程中,讀者有時候希望數組的長度和元素都能隨著程序的運行不斷改變。但改變一次就重新開辟一個新的數組對象將會十分占用內存。所以,前面所講的數組都不能滿足要求。有解決方案嗎?當然有!這正是動態數組要解決的問題。.NET Framework中提供了一個ArrayList類,專門用于處理可按動態增減成員的數組。ArrayList類包含在System.Collections命名空間中,相關屬性和方法如表5-1所示。

表5-1 ArrayList類的相關屬性和方法

5.3.1 創建簡單的動態數組

了解了ArrayList類屬性和方法后,下面以一個例子說明以上的某些方法,幫助讀者掌握ArrayList類的運用。

打開VS2008,在D:\C#\ch5目錄下建立名為ArraylistTest的控制臺應用程序,步驟如下。

(1)在命名空間中包含System.Collections,因為ArrayList類包含在該命名空間內。

(2)在Main()函數中添加如下代碼。

        ArrayList al = new ArrayList();
        al.Add(0.05f);              //向ArrayList結尾處添加4種不同類型的對象
        al.Add("sss");
        al.Add(' s' );
        al.Add(3);
        Console.WriteLine("當前ArrayList里的全部元素如下:");
        for (int i = 0; i < 4; i++)
          {
            Console.Write(al[i]+" ");
          }
        Console.WriteLine("\n當前ArrayList里的元素個數共有:");
        Console.Write(al.Count);     //獲取ArrayList中的元素個數
        Console.WriteLine("\n繼續添加后當前ArrayList里的全部元素如下:");
        al.Insert(1, "aa");           //在ArrayList索引值為1處添加字符串aa
        for (int i = 0; i < 5; i++)
            {
              Console.Write(al[i]+" ");
            }
        Console.WriteLine("\n倒序后當前ArrayList里的全部元素如下:");
        al.Reverse();              //將ArrayList中的所有元素逆轉排序
        for (int i = 0; i < 5; i++)
            {
          Console.Write(al[i]+" ");
          }
      Console.WriteLine("\n刪除后當前ArrayList里的全部元素如下:");
      al.RemoveAt(2);
      for (int i = 0; i < 3; i++)
          {
            Console.Write(al[i] + " ");
          }
      Console.ReadKey();

程序運行結果如圖5-3所示。

圖5-3 運行結果

通過該例子,可以看出ArrayList具有以下優勢。

(1)ArrayList中能夠同時存儲不同類型的數據,比如第一個元素是int型,第二個可以是string型,這是常規數組辦不到的。

(2)ArrayList能夠隨時添加或刪除元素,而不需開辟新的數組對象,并且代碼很簡單,也不需復雜的類型轉化。

(3)能夠隨時在ArrayList的任意位置插入數據。

5.3.2 動態數組的排序

下面再看一個例子,產生一個int數組,長度為50,并向其中隨機插入1~50之間的任意整數,并且不能重復,然后完成排序。對于這個例子,用ArrayList實現起來非常方便。

打開VS2008,在D:\C#\ch5目錄下建立名為ArraylistTest2的控制臺應用程序。打開工程,在Main()函數中添加如下代碼。

        int[] intArr = new int[50];            //創建數組
        ArrayList myList = new ArrayList();    //創建ArrayList
        Random rnd = new Random();             //創建隨機數類
        while (myList.Count < 50)
        {
            int num = rnd.Next(1, 51);          //生成1~50之間的任意整數
            if (! myList.Contains(num))
              myList.Add(num);                 //向ArrayList添加元素
        }
        Console.WriteLine("隨機插入后的數組:");
        for (int i = 0; i < 50; i++)
        {
            intArr[i] = (int)myList[i];
            Console.Write("{0} ", intArr[i]);
        }
        //冒泡法排序
        for (int j = intArr.Length -1; j >= 0; j--)
        {
            for (int k = 0; k < j; k++)
            {
              int m = 0;
              if (intArr[k] < intArr[k + 1])
              {
                  m = intArr[k];
                  intArr[k] = intArr[k + 1];
                  intArr[k + 1] = m;
              }
            }
        }
        Console.WriteLine();
        Console.WriteLine("排序后的數組:");
        //輸出排序結果
        for (int i = 0; i < 50; i++)
        {
            Console.Write("{0} ", intArr[i]);
        }
        Console.ReadKey();

運行結果如圖5-4所示。

圖5-4 運行結果

5.4 數組的特殊操作

本節主要介紹兩個字符串的特殊操作,一是將數組作為參數傳遞,二是數組的數組,下面將通過例子進行詳細說明。

5.4.1 作為參數傳遞的數組

數組是一種引用類型,它能作為參數傳遞給函數調用。下面兩節將按不同維數的數組分別進行舉例介紹。

5.4.2 將一維數組作為參數傳遞

打開VS2008,在D:\C#\ch5目錄下建立名為ArrayParaTest的控制臺應用程序,在Program.cs中添加Array()函數,代碼如下。

        private static void Array(int[] s)
            {
              for (int i = 0; i < s.Length; i++)
                {
                    Console.Write(s[i].ToString()+" ");
                 }
              }

然后在Main()函數中添加如下代碼。

        int[] ss = new int[6] { 1, 2, 3, 4, 5, 6 };
        Array(ss);
        Console.ReadKey();

運行結果如圖5-5所示。

圖5-5 運行結果

本例中,將數組s作為Array()函數的參數進行傳遞,在Main()函數中被賦值,將所有元素輸出到控制臺顯示。

5.4.3 將多維數組作為參數傳遞

打開VS2008,在D:\C#\ch5目錄下建立名為ArrayParaTest2的控制臺應用程序。在Program.cs中添加mArray()函數,代碼如下所示。

        private static void mArray(int[, , ] ss)
            {
              foreach (int s in ss)
                {
                    Console.Write(s.ToString()+" ");
                }
            }

然后在Main()函數中添加如下代碼。

        int[, , ] sss = new int[3, 3, 3];
        for (int i = 0; i < 3; i++)
          {
            for (int j = 0; j < 3; j++)
                {
                  for (int m = 0; m < 3; m++)
                      {
                        sss[i, j, m] = i + j + m;
                      }
                }
            }
        mArray(sss);
        Console.ReadKey();

運行結果如圖5-6所示。

將多維數組作為參數傳遞與一維數組幾乎沒有什么區別。只是對多維數組元素的訪問時要麻煩一些。

圖5-6 運行結果

5.4.4 數組的數組

顧名思義,數組的數組意思是某數組的元素也是數組,也可以稱作“復合”數組。它的特點是數組長度在數組聲明的時候可以不被指定,先來看下面的一個例子。

        string[][] s = new string[4][];          //定義一個二維數組
        s[0] = new string[] { "a", "a", "a" };
        s[1] = new string[] { "b", "b", "b", "b"};
        s[2] = new string[] { "c", "c", "c", "c", "c" };
        s[3] = new string[] { "d", "d", "d", "d", "d", "d" };

到這里,可能有讀者會問,對這樣的數組進行訪問和以前的數組有區別嗎?答案是肯定的。比如想輸出數組s里面的所有元素,如果直接采用下面的代碼。

        foreach (string ss in s)
              {
                Console.Write(ss + " ");
              }

會出現如下錯誤信息。

        錯誤1   無法將類型“string[]”轉換為“string”

為什么會這樣呢?因為數組s中包含的元素是string[]型,而非string型,所以正確的做法應該如下面代碼所示。

        foreach (string[]ss in s)
            {
              foreach (string sss in ss)
                    {
                      Console.Write(sss + " ");
                    }
            }

先遍歷訪問每個子數組,再將子數組里的元素循環輸出到控制臺。數組的數組并不常用,但在某些特殊場合還是比較有用的,它能節省程序運行的時間。

5.5 小結

本章主要介紹了一維數組和多維數組的創建及基本的使用方法,包括數組中元素的訪問和遍歷輸出。重點說明了動態數組類ArrayList的屬性、方法和用法,以一個例子涵蓋了大多數ArrayList的常見操作。最后,還介紹了作為參數傳遞的數組和數組的數組??傊?,數組是繼字符串后C#的又一個應用廣泛的數據處理類型,在很多場合都能用到。

主站蜘蛛池模板: 青州市| 长武县| 永新县| 靖州| 曲阜市| 崇阳县| 定安县| 锡林浩特市| 色达县| 尼勒克县| 象山县| 奉化市| 乌兰浩特市| 盱眙县| 吉安市| 文化| 彰化市| 繁峙县| 博客| 永宁县| 平舆县| 哈密市| 拜城县| 名山县| 蒲江县| 梅河口市| 固阳县| 道孚县| 融水| 康马县| 通许县| 独山县| 承德县| 珠海市| 江北区| 偏关县| 潞城市| 临桂县| 三台县| 那曲县| 临安市|