【ITOO】--陣列、集合、泛型解析

ZeroWM發表於2015-03-08

一、概念(from 百科)

陣列:把有限個型別相同的變數用一個名字命名,然後用編號區分他們的變數的集合,這個名字稱為陣列名,編號稱為下標。

集合集合是一組可變數量的資料項(可為0)的組合,這些資料項可能共享某些特徵,需要以某種操作方式一起進行操作。

泛型:在程式編碼中一些包含引數的型別,也就是說泛型的引數只可以代表類,不能代表個別物件。

  

二、進化史

 


  開始用記憶體中的一個位置對映一個值,用“變數”來使用這個值。進一步發展成,用變數來引用一組值,陣列誕生。後來有了集合,它是更強的的陣列,依賴object類。存入集合要經歷裝箱,轉換成Object類,拿出的時候再拆箱成之前的型別。在元素量大的時候,會導致效能下降。由於我們使用同一型別更方便操作,後來就產生了泛型,它可以把裡面的元素轉換成特定的型別,減少了拆裝箱帶來的困擾。

 

三、C#對比

 

C#集合包含

名稱

區別

System.Array

陣列

長度一定,不可增刪改查

System.Collection

非泛型集合

ArrayList可動態的調整大小,具有新增、移除的功能

 包括ArrayList  BitArray  Hastable  Queue  Stack  SortedList 。

所有的集合都要實現一個介面 IEnumerable

System.Collection.Generic

泛型集合

相當於免去轉換成Object的集合。

提供了更高的型別安全和效率。

 

 

四、高校雲平臺中泛型集合的應用


新生中WCF層中的一個小demo:

<span style="font-family:KaiTi_GB2312;font-size:18px;">        /// <summary>
        /// 根據學院查詢這個學院的學生個數
        /// </summary>
        /// <param name="freshDepartment">學院的實體,學院名稱</param>
        /// <returns></returns>       

        public List<FreshStudentReportContracts> QueryAllFreshReport()
        {

            //例項化學生報表實體型別的泛型集合
            List<FreshStudentReportContracts> listStudentReport = new List<FreshStudentReportContracts>();
            
            //例項化B層學生資訊
            FreshStudentEntityService en = new FreshStudentEntityService();

            //通過呼叫B層的方法實現IList的介面
            //建立一個基於IList的介面,List是建立一個List的例項
            IList<ITOO.FreshService.Model.FreshStudentEntity> studentCollections = en.LoadEnities().ToList();
            
            //定義B層查詢專業資訊的方法
            FreshDepartmentEntiyService QueryAllDepartments = new FreshDepartmentEntiyService();
           
            //呼叫B層的方法
            var listDepartment = QueryAllDepartments.QueryDepartment();
            //獲得所有的學生實體

            //定義一個宿舍實體FreshDep,從listDepartment中取實體屬性進行賦值
            foreach (FreshDepartmentEntiy FreshDep in listDepartment)
            {
                //定義資料契約
                FreshStudentReportContracts fsrc = new FreshStudentReportContracts();

                //把實體的值賦給資料契約

                fsrc.DepartmentName = FreshDep.DepartmentName;
                //查詢錄取學生總人數
                fsrc.EnterStudentNumber = studentCollections.Where(s => s.FreshDepartmentName == FreshDep.DepartmentName).ToList().Count();
                //查詢報導學生總人數
                fsrc.RegisterStudentNumber = studentCollections.Where(e => e.IsCheckIn == 1 && e.FreshDepartmentName == FreshDep.DepartmentName).ToList().Count();
                //查詢報導男生總人數
                fsrc.RegisterBoysNumber = studentCollections.Where(e => e.IsCheckIn == 1 && e.Sex == 0 && e.FreshDepartmentName == FreshDep.DepartmentName).ToList().Count();
                //查詢報導女生總人數
                fsrc.RegisterGrilsNumber = studentCollections.Where(e => e.IsCheckIn == 1 && e.Sex == 1 && e.FreshDepartmentName == FreshDep.DepartmentName).ToList().Count();
               
                //把資料契約值新增到學生報表資料契約中

                listStudentReport.Add(fsrc);
            }
          
            return listStudentReport;//返回學生報表資料契約中的資料


        }</span>

    泛型集合,我的理解是List<>就是集合,尖括號裡面的東西就是指定好的泛泛的那個型別。

     在這段程式碼中,首先定義了一個方法:根據學院查詢這個學院的學生個數的方法——QueryAllFreshReport,把查詢的結果放到List<FreshStudentReportContracts>這個泛型集合裡面。這個泛型指定的型別是FreshStudentReportContracts.

  在這個集合裡面,可以新增該資料契約裡面含有欄位(DepartmentName,EnterStudentNuber等)對應的屬性值.

  之前做機房的時候,泛型集合裡面存放的是實體。新生專案中,存放的不僅僅可以是model實體,也可以是資料契約實體,這也算是一種進步吧。


五、總結

  無論是變數、陣列、集合、泛型都是一個容器,能盛放資料,只是“瓶口”不太一樣。 從盛放一個資料,同種型別的多個資料,到不同種類的多個資料,容器的發展更加的人性化,人類物件導向的思想也在不斷的提高。相信未來在學習Java的時候,對容器的理解會更加的深入。

  


相關文章