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

5章 數(shù)組處理

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

5.1 創(chuàng)建數(shù)組

同其他數(shù)據(jù)類型一樣,數(shù)組的創(chuàng)建也十分容易,示例代碼如下所示。

        byte[] a = new byte[5];

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

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

        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();           //轉(zhuǎn)化為string型從控制臺輸出
            Console.Write(a2[i] + " ");
          }
        Console.ReadKey();

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

圖5-1 運行結(jié)果

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

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

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

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

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

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

5.2 多維數(shù)組

在實際的數(shù)據(jù)處理中,三維數(shù)組就基本能處理所有問題。在此,舉一個三維數(shù)組的例子并說明foreach關(guān)鍵字在數(shù)組處理中的應(yīng)用。

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

        int[, , ] s = new int[3, 3, 3];
        for (int i = 0; i < 3; i++)    //通過三個for循環(huán)對該三維數(shù)組進行賦值
          {
              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輸出數(shù)組中的所有元素到控制臺顯示
          {
              Console.Write(k.ToString()+" ");
          }
        Console.ReadKey();

運行結(jié)果如圖5-2所示。

圖5-2 運行結(jié)果

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

5.3 動態(tài)數(shù)組

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

表5-1 ArrayList類的相關(guān)屬性和方法

5.3.1 創(chuàng)建簡單的動態(tài)數(shù)組

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

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

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

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

        ArrayList al = new ArrayList();
        al.Add(0.05f);              //向ArrayList結(jié)尾處添加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里的元素個數(shù)共有:");
        Console.Write(al.Count);     //獲取ArrayList中的元素個數(shù)
        Console.WriteLine("\n繼續(xù)添加后當前ArrayList里的全部元素如下:");
        al.Insert(1, "aa");           //在ArrayList索引值為1處添加字符串a(chǎn)a
        for (int i = 0; i < 5; i++)
            {
              Console.Write(al[i]+" ");
            }
        Console.WriteLine("\n倒序后當前ArrayList里的全部元素如下:");
        al.Reverse();              //將ArrayList中的所有元素逆轉(zhuǎn)排序
        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();

程序運行結(jié)果如圖5-3所示。

圖5-3 運行結(jié)果

通過該例子,可以看出ArrayList具有以下優(yōu)勢。

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

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

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

5.3.2 動態(tài)數(shù)組的排序

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

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

        int[] intArr = new int[50];            //創(chuàng)建數(shù)組
        ArrayList myList = new ArrayList();    //創(chuàng)建ArrayList
        Random rnd = new Random();             //創(chuàng)建隨機數(shù)類
        while (myList.Count < 50)
        {
            int num = rnd.Next(1, 51);          //生成1~50之間的任意整數(shù)
            if (! myList.Contains(num))
              myList.Add(num);                 //向ArrayList添加元素
        }
        Console.WriteLine("隨機插入后的數(shù)組:");
        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("排序后的數(shù)組:");
        //輸出排序結(jié)果
        for (int i = 0; i < 50; i++)
        {
            Console.Write("{0} ", intArr[i]);
        }
        Console.ReadKey();

運行結(jié)果如圖5-4所示。

圖5-4 運行結(jié)果

5.4 數(shù)組的特殊操作

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

5.4.1 作為參數(shù)傳遞的數(shù)組

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

5.4.2 將一維數(shù)組作為參數(shù)傳遞

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

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

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

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

運行結(jié)果如圖5-5所示。

圖5-5 運行結(jié)果

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

5.4.3 將多維數(shù)組作為參數(shù)傳遞

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

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

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

        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();

運行結(jié)果如圖5-6所示。

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

圖5-6 運行結(jié)果

5.4.4 數(shù)組的數(shù)組

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

        string[][] s = new string[4][];          //定義一個二維數(shù)組
        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" };

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

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

會出現(xiàn)如下錯誤信息。

        錯誤1   無法將類型“string[]”轉(zhuǎn)換為“string”

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

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

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

5.5 小結(jié)

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

主站蜘蛛池模板: 屯门区| 周至县| 仪征市| 沛县| 福清市| 霸州市| 农安县| 唐河县| 东光县| 崇文区| 仙桃市| 霍邱县| 荣昌县| 永春县| 满洲里市| 通城县| 古浪县| 阿勒泰市| 南江县| 西盟| 东兰县| 苏尼特右旗| 胶州市| 隆回县| 舒兰市| 二连浩特市| 缙云县| 伊宁县| 琼海市| 镇康县| 苍南县| 汶川县| 东至县| 潼关县| 安西县| 会理县| 平江县| 鸡东县| 栾川县| 福海县| 广安市|