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

原文地址:https://www.cnblogs.com/ARMdong/p/3070260.html