LinQ In Action 学习第二章

第二章主要复习.net 3.0 与Linq 有关的新知识

1.隐式类型: 必须初始化不能赋值null,只是由编译器推测其类型罢了

2. 对象初始化器,集合初始化器

1,2 很简单就不介绍了

3. lamdor 表达式 涉及到委托 需要好好研究一下 委托。

4.匿名方法

5. 扩展方法

6.匿名类型

这一章看完觉得比较简单。 写一个总的例子应用上上述所有特性吧。

一:委托的例子

// 声明委托类型

public delegate bool FilterDelegate(Process p);
    public class ProcessData
    {
        public string Name { set; get; }
        public Int64 Memory { set; get; }
        public Int32 ID { set; get; }
    }
    class Program
    {

    //把委托注册到方法上。
        static void displayProcesses( FilterDelegate match)
        {
            var plist = new List<ProcessData>();
            foreach (var p in Process.GetProcesses())
            {
                if (match(p))
                {
                    plist.Add(new ProcessData { ID = p.Id, Memory = p.WorkingSet64, Name = p.ProcessName });
                }
            }
            ObjectDumper.Write(plist);
           
        }
        public static bool Filter(Process pro) {
           return pro.WorkingSet64  >= 20*1024*1024;
        }
        static void Main(string[] args)
        {

      // 应用委托
            displayProcesses(Filter);
            Console.Read();
        }
 
    }

也可以用Predict <T> 微软定义好的返回boolean 类型的委托 参数object.

优化后的代码:

 static void displayProcesses( Predicate<Process> match)
        {
            var plist = new List<ProcessData>(); // implicitly type variant
            foreach (var p in Process.GetProcesses())
            {
                if (match(p))
                {
                    plist.Add(new ProcessData { ID = p.Id, Memory = p.WorkingSet64, Name = p.ProcessName });//Object initializor
                }

            }
            ObjectDumper.Write(plist);
           
        }
        static void Main(string[] args)
        {
            displayProcesses(pcess => pcess.WorkingSet64 >= 20 * 1024 * 1024); // lamador Expression
            Console.Read();
        }

 最后写一个总的例子,把应用到的技术加comment 加以标注。

public class ProcessData
    {
        public string Name { set; get; }
        public Int64 Memory { set; get; }
        public Int32 ID { set; get; }
    }
    static class Program
    {
        static void displayProcesses( Predicate<Process> match)
        {
            var plist = new List<ProcessData>(); // implicitly type variant
            foreach (var p in Process.GetProcesses())
            {
                if (match(p))
                {
                    plist.Add(new ProcessData { ID = p.Id, Memory = p.WorkingSet64, Name = p.ProcessName });//Object initializor
                }

            }
            ObjectDumper.Write(plist);
            // display total memory for process and top 2 process memory
            Int64 sumMeoryTotal = plist.TotalMemory(); // extension method.
            Console.WriteLine("Memory of all the process:" + sumMeoryTotal);
            var tot2ProcessMemory =
                plist.OrderByDescending(p => p.Memory)
                    .Take(2).Sum(pp => pp.Memory);
            Console.WriteLine("top 2 process Memory ; " + tot2ProcessMemory);
 
        }
         static Int64 TotalMemory(this IEnumerable<ProcessData> p)
        {
            return  p.Sum( pp => pp.Memory );
        }
         static Int64 TotalMemoryProcess(this IEnumerable<ProcessData> pp)
        {
            Int64 sum = 0;
            foreach (var p in pp)
            {
                sum += p.Memory;
            }
            return sum;
        }
        static void Main(string[] args)
        {
            displayProcesses(pcess => pcess.WorkingSet64 >= 20 * 1024 * 1024); // lamador Expression
            Console.Read();
        }

第二张结束,主要介绍了关于linq要用的.net 3.0 的新特性。

原文地址:https://www.cnblogs.com/recordlife/p/4211051.html