Linq學習之路(02) - 什么使Linq變得如此簡單(一)?


  在這篇文章中,我主要簡單的闡述一下Linq的基石:隱式類型局部變量、對象集合初始化器、Lambda表達式、擴展方法還有匿名類型;C#3.0中為我們提供了這些語法,本文主要圍繞一個實例讓大家了解如何通過這些技術來改善我們的代碼。這個實例非常簡單,就是將我們的計算機中正在跑的程序輸出到控制台中顯示。

傳統的方法:創建一個控制台項目

  (1)、首先定義一個描述進程的實體類ProcessData:

   /// <summary>
    /// 進程實體類
    /// </summary>
    class ProcessData
    {
        /// <summary>
        /// 進程Id
        /// 普通整型
        /// </summary>
        public Int32 Id { get; set; }

        /// <summary>
        /// 進程名稱
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 消耗內存大小
        /// 長整型
        /// </summary>
        public Int64 Memory { get; set; }
    }

  (2)、編寫將計算機中正在運行的進程輸出到控制台的方法:

        /// <summary>
        /// 展示進程的方法
        /// </summary>
        static void DisplayProcesses()
        {
            List<ProcessData> processes = new List<ProcessData>();

            foreach (Process process in Process.GetProcesses())
            {
                ProcessData data = new ProcessData();
                data.Id = process.Id;
                data.Name = process.ProcessName;
                data.Memory = process.WorkingSet64;
                processes.Add(data);
            }

            //遍歷processes,輸出到控制台
            foreach (ProcessData data in processes)
            {
                Console.Write("Id = {0}\tName = {1}\tMemory = {2}", data.Id, data.Name, data.Memory);
                Console.WriteLine();
            }
        }

   這里我們用到了.net framework提供的Process類,所以我們要引用命名空間:System.Diagnostics

  (3)、在Mian方法中調用DisplayProcess方法:

        static void Main(string[] args)
        {
            DisplayProcesses();
            Console.ReadKey();
        }

  (4)、輸出結果:(部分截圖)

  這樣我們就得到了本地計算機正在跑的程序...,接下來我們將利用前面提到的5個技術,逐個的運用到到我們的程序中。

利用隱式類型局部變量進行優化:

  C# 3.0開始,.net fromework為我們提供了該技術,使用起來非常靈活,我們在定義一個變量的時候不需要指定它的類型,使用一個var關鍵字就搞定了,編譯器可以自動的通過后面的表達式推斷出該變量的類型,這樣大大節約了我們編程的時間,提高開發效率,減少代碼量;是一種編譯時驗證技術,生成的IL代碼和使用指定類型變量生成的IL代碼是一樣的,所以不存在性能上的損耗,而且是強類型的,和JavaScript中的var意義不同。好了,我們直接看代碼吧。。。

  (1)、展示進程的方法DisplayProcess

 

        /// <summary>
        /// 展示進程的方法
        /// </summary>
        static void DisplayProcesses()
        {
            //隱式類型局部變量processes
            //這里processes的類型編譯器會自動推斷出為List<ProcessData>的泛型集合
            var processes = new List<ProcessData>();

            //process的類型為Process
            foreach (var process in Process.GetProcesses())
            {
                //data的類型為ProcessData
                var data = new ProcessData();
                data.Id = process.Id;
                data.Name = process.ProcessName;
                data.Memory = process.WorkingSet64;
                processes.Add(data);
            }

            //遍歷processes,輸出到控制台
            foreach (var data in processes)
            {
                Console.Write("Id = {0}\tName = {1}\tMemory = {2}", data.Id, data.Name, data.Memory);
                Console.WriteLine();
            }
        }

 

  (2)、其他代碼不做改動,妖怪,快顯出原形:

  我們可以看到,同樣達到效果。。。好的,我們繼續。

利用對象初始化器進行優化:

  對象初始化器使循規蹈矩成為過去時,我們需要的是創新、個性。。。哈哈哈,走,哥帶你看妹紙去。。。

  (1)、還是DisplayProcess方法,你們上當了,沒有妹紙,不過學完Linq技術,你們還怕沒有妹紙嗎?這次我讓它換個馬甲。。。

        /// <summary>
        /// 展示進程的方法
        /// </summary>
        static void DisplayProcesses()
        {
            var processes = new List<ProcessData>();

            foreach (var process in Process.GetProcesses())
            {
                processes.Add(new ProcessData
                {
                    Id = process.Id,
                    Name = process.ProcessName,
                    Memory = process.WorkingSet64
                });
            }

            //遍歷processes,輸出到控制台
            foreach (var data in processes)
            {
                Console.Write("Id = {0}\tName = {1}\tMemory = {2}", data.Id, data.Name, data.Memory);
                Console.WriteLine();
            }
        }

  嗨,嗨,回過神來,不要看了,這個“妹紙”漂亮吧?一見鍾情,愛情就是這么簡單。。。

  (2)、再讓你看一眼妹紙:

  由於篇幅有限,Lambda表達式、擴展方法還有匿名類型放到下一篇來講解,歡迎繼續的關注。。。

QQ交流群:159227188  上海-Michael

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM