一、.LINQ查询
    例如:
         static void LINQQuery()
        {
            var query = from r in Formula1.GetChampions()
                        where r.Country == "Brazil"
                        orderby r.Wins descending
                        select r;

            foreach (var r in query)
            {
                Console.WriteLine("{0:A}", r);
            }

        }
    .扩展方法
    扩展方法在静态类中声明,定义为一个静态方法。其中第一个参数定义了他扩展的类型,并且需要带this关键字。
    IEnumerable类中存在扩展方法Where()、OrderbyDescending()和Select().这些方法都返回IEnumerable<TSource>.
    例如:
         static void ExtensionMethods()
        {
            var champions = new List<Racer>(Formula1.GetChampions());
            IEnumerable<Racer> brazilChampions =
                champions.Where(r => r.Country == "Brazil").
                        OrderByDescending(r => r.Wins).
                        Select(r => r);

            foreach (Racer r in brazilChampions)
            {
                Console.WriteLine("{0:A}", r);
            }
        }
    .推迟查询的执行
        在运行期间定义查询表达式时,查询就不会运行。查询会在迭代数据项时运行。
    .标准的查询操作符
            )筛选:where 子句
                static void Filtering()
                {
                    var racers = from r in Formula1.GetChampions()
                                  && (r.Country == "Brazil" || r.Country == "Austria")
                                 select r;

                    foreach (var r in racers)
                    {
                        Console.WriteLine("{0:A}", r);
                    }

                }
            )用索引筛选:在where()方法的重载中,可以传递第二个参数————索引。
              例如返回姓氏以A开头、索引为偶数的赛手:
                 static void IndexFiltering()
                {
                    var racers = Formula1.GetChampions().
                            Where((r, index) => r.LastName.StartsWith( != );
                    foreach (var r in racers)
                    {
                        Console.WriteLine("{0:A}", r);
                    }

                }
            )类型筛选:基于类型的筛选,可以使用OfType()扩展方法。
                static void TypeFiltering()
                {
                    , ,  };
                    var query = data.OfType<string>();
                    foreach (var s in query)
                    {
                        Console.WriteLine(s);
                    }

                }
            )复合的from子句
                 static void CompoundFrom()
                {
                    var ferrariDrivers = from r in Formula1.GetChampions()
                                         from c in r.Cars
                                         where c == "Ferrari"
                                         orderby r.LastName
                                         select r.FirstName + " " + r.LastName;

                    foreach (var racer in ferrariDrivers)
                    {
                        Console.WriteLine(racer);
                    }

                }
            )分组
            使用linq语法
                 static void Grouping()
                {
                    var countries = from r in Formula1.GetChampions()
                                    group r by r.Country into g
                                    orderby g.Count() descending, g.Key

                                    select new
                                    {
                                        Country = g.Key,
                                        Count = g.Count()
                                    };

                    foreach (var item in countries)
                    {
                        Console.WriteLine("{0, -10} {1}", item.Country, item.Count);
                    }

                }
            使用扩展方法
                static void Grouping()
                {
                    var countries = from r in Formula1.GetChampions()
                                    group r by r.Country into g
                                    orderby g.Count() descending, g.Key

                                    select new
                                    {
                                        Country = g.Key,
                                        Count = g.Count()
                                    };

                    foreach (var item in countries)
                    {
                        Console.WriteLine("{0, -10} {1}", item.Country, item.Count);
                    }

                }
    .对嵌套的对象分组
         static void GroupingWithNestedObjects()
        {
            var countries = from r in Formula1.GetChampions()
                            group r by r.Country into g
                            orderby g.Count() descending, g.Key

                            select new
                            {
                                Country = g.Key,
                                Count = g.Count(),
                                Racers = from r1 in g
                                         orderby r1.LastName
                                         select r1.FirstName + " " + r1.LastName
                            };
            foreach (var item in countries)
            {
                Console.WriteLine("{0, -10} {1}", item.Country, item.Count);
                foreach (var name in item.Racers)
                {
                    Console.Write("{0}; ", name);
                }
                Console.WriteLine();
            }

        }
    .    连接
         static void Join()
        {
            var racers = from r in Formula1.GetChampions()
                         from y in r.Years

                         select new
                         {
                             Year = y,
                             Name = r.FirstName + " " + r.LastName
                         };

            var teams = from t in
                            Formula1.GetContructorChampions()
                        from y in t.Years

                        select new
                        {
                            Year = y,
                            Name = t.Name
                        };

            var racersAndTeams =
                  from r in racers
                  join t in teams on r.Year equals t.Year
                  select new
                  {
                      Year = r.Year,
                      Racer = r.Name,
                      Team = t.Name
                  };

            Console.WriteLine("Year  Champion " + "Constructor Title");
            foreach (var item in racersAndTeams)
            {
                Console.WriteLine("{0}: {1,-20} {2}",
                   item.Year, item.Racer, item.Team);
            }

        }
    .集合操作
        扩展方法Distinctt()、Union()、Intersect()和Except()都是集合操作。
         static void SetOperations()
        {
            Func<string, IEnumerable<Racer>> racersByCar =
                car => from r in Formula1.GetChampions()
                       from c in r.Cars
                       where c == car
                       orderby r.LastName
                       select r;

            Console.WriteLine("World champion with Ferrari and McLaren");
            foreach (var racer in racersByCar("Ferrari").Intersect(racersByCar("McLaren")))
            {
                Console.WriteLine(racer);
            }
        }
    .合并
        Zip()方法,需要把第二个集合作为方法的第一个参数,第二个参数的类型时Func<TFirst,TSecond,TResult>。它通过参数first接收第一个集合的元素,通过参数second接收第二个集合的元素。
        static void ZipOperation()
        {
            var racerNames = from r in Formula1.GetChampions()
                             where r.Country == "Italy"
                             orderby r.Wins descending
                             select new
                             {
                                 Name = r.FirstName + " " + r.LastName
                             };

            var racerNamesAndStarts = from r in Formula1.GetChampions()
                                   where r.Country == "Italy"
                                   orderby r.Wins descending
                                   select new
                                   {
                                       LastName = r.LastName,
                                       Starts = r.Starts
                                   };

            var racers = racerNames.Zip(racerNamesAndStarts, (first, second) => first.Name + ", starts: " + second.Starts);
            foreach (var r in racers)
            {
                Console.WriteLine(r);
            }

        }
    .分区
    扩展方法Take()和Skip()等的分区操作可用于分页。
      static void Partitioning()
        {
            ;

            int numberPages = (int)Math.Ceiling(Formula1.GetChampions().Count() /
                  (double)pageSize);

            ; page < numberPages; page++)
            {
                Console.WriteLine("Page {0}", page);

                var racers =
                   (from r in Formula1.GetChampions()
                    orderby r.LastName
                    select r.FirstName + " " + r.LastName).
                   Skip(page * pageSize).Take(pageSize);

                foreach (var name in racers)
                {
                    Console.WriteLine(name);
                }
                Console.WriteLine();
            }

        }
    .聚合操作符
       如Count()、Sum()、Min()、Max()、Average()和Aggregate()不返回一个序列,而返回一个值。
        例如sum()函数的用法:
         static void Aggregate2()
        {
            var countries = (from c in
                                 from r in Formula1.GetChampions()
                                 group r by r.Country into c
                                 select new
                                 {
                                     Country = c.Key,
                                     Wins = (from r1 in c
                                             select r1.Wins).Sum()
                                 }
                             orderby c.Wins descending, c.Country
                             );

            foreach (var country in countries)
            {
                Console.WriteLine("{0} {1}", country.Country, country.Wins);
            }

        }
    .生成操作符
        有时需要填充一个范围的数字,应使用Range()方法。这个方法把第一个参数作为起始值,第二个参数作为要填充的项数。
        Empty()方法返回一个不返回值的迭代器,他可以用于一个集合的参数,可以跟参数传递空集合。
        Repeate()方法返回一个迭代器,该迭代器吧同一个值重复特定的次数。
二、并行LINQ
    .分区器:使用AsParallel()可以创建
        static void IntroParallel()
        {
            ;
            var data = new int[arraySize];
            var r = new Random();
            ; i < arraySize; i++)
            {
                data[i] = r.Next();
            }
            Stopwatch watch = new Stopwatch();
            watch.Start();

            var q1 = (from x in Partitioner.Create(data).AsParallel()

                     select x).Sum();
            watch.Stop();
            Console.WriteLine(watch.ElapsedMilliseconds);
        }
    .要取消长时间运行的查询,可以给查询添加WithCancellation()方法,并传递一个CancellationToken令牌作为参数。CancellationToken令牌cong CancellationTokenSource类中创建。
    在主线程中调用CancellationTokenSource类的Cancel()方法可以取消任务。
        static void Cancellation()
        {
            ;
            var data = new int[arraySize];
            var r = new Random();
            ; i < arraySize; i++)
            {
                data[i] = r.Next();
            }

            var cts = new CancellationTokenSource();

            new Thread(() =>
                {
                    try
                    {
                        var sum = (from x in data.AsParallel().WithCancellation(cts.Token)

                                   select x).Sum();
                        Console.WriteLine("query finished, sum: {0}", sum);
                    }
                    catch (OperationCanceledException ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }).Start();

            Console.WriteLine("query started");
            Console.Write("cancel? ");
            int input = Console.Read();
            if (input == 'Y' || input == 'y')
            {
                // cancel!
                cts.Cancel();
            }
        }
            

第十讲(LINQ)的更多相关文章

  1. Java Web快速入门——全十讲

    Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...

  2. C语言第十讲,枚举类型简单说明

    C语言第十讲,枚举类型简单说明 一丶C语言中的枚举类型(ENUM) 在我们实际工作中,或者编写代码中.我们有的时候会用固定的值.而且不是很多. 这个时候就可以使用枚举了.如果我们使用#define显然 ...

  3. Python十讲

    第一讲:从零开始学Python 第二讲:变量和基础数据类型 第三讲:条件分支以及循环 第四讲:列表与元组 第五讲:字典 第六讲:函数 第七讲:类 第八讲:标准库 第九讲:异常 第十讲:文件处理

  4. 第十讲_图像检索 Image Retrieval

    第十讲_图像检索 Image Retrieval 刚要 主要是图像预处理和特征提取+相似度计算 相似颜色检索 算法结构 颜色特征提取:统计图片的颜色成分 颜色特征相似度计算 色差距离 发展:欧式距离- ...

  5. C#编程(六十)----------LINQ的概述

    LINQ的概述 LINQ的全名为语言继承查询,是VS2008个.NET3.5版中一款突破性的创新,他再对象领域和数据领域之间架起了一座桥梁.使用LINQ能大大加快对于对象数据等等的查询,加快效率. 由 ...

  6. Dynamic CRM 2013学习笔记(三十)Linq使用报错 A proxy type with the name account has been defined by another assembly

    在CRM中使用linq时,有时会报这个错误: A proxy type with the name account has been defined by another assembly. Curr ...

  7. 第三十讲:Android之Animation(五)

    天行健,君子以自强不息.--<周易·乾·象> 本讲内容:逐帧动画 Frame Animation 逐帧动画 Frame Animation就是说一帧一帧的连起来播放就变成了动画,和放电影的 ...

  8. 16汇编第十讲完结Call变为函数以及指令的最后讲解

    16汇编完结Call变为函数以及指令的最后讲解 学了10天的16位汇编,这一讲就结束了,这里总结一下昨天的LOOP指令的缺陷,因为lOOP指令的缺陷,所以我们都改为下面的汇编代码使用了,自己去写,其中 ...

  9. 趣谈Linux操作系统学习笔记:第二十讲

    一.引子 1.计算两方面的原因 2.内存管理机制 二.独享内存空间的原理 1.会议室和物理内存的关系 和会议室一样,内存都被分成一块块儿的,都编号了号,例如3F-10就是三楼十号会议室.内存页有这样一 ...

随机推荐

  1. C#知识点总结系列:4、C#中Monitor和Lock以及区别

    Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取 ...

  2. Node聊天程序实例06:server.js

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. server ...

  3. 理解RESTful

    REST全称为Representational State Transfer,可以翻译为“表现状态转换”,是由是Roy Thomas Fielding在他2000年的博士论文中提出的,目的是为了得到一 ...

  4. AWT编程学习01(未完成)

    本文资料来源:<java疯狂讲义> 作者:李刚 终于要学习这一部分了~~虽然很多人(明明是绝大多数的人)说学这个没有用...而且有点过时了...但我觉得很有意思啊...感兴趣就学~~反正多 ...

  5. PBOC金融IC卡,卡片与终端交互的13个步骤,简介-第一组(转)

    两个PPT结合起来--一些基础介绍--每一步的详细细节还要去研读文档 EMV-全球标准PBOC-国内标准 ----------------------一:必选:应用选择应用选择的方法:目录选择法.AI ...

  6. flume原理及代码实现

    转载标明出处:http://www.cnblogs.com/adealjason/p/6240122.html 最近想玩一下流计算,先看了flume的实现原理及源码 源码可以去apache 官网下载 ...

  7. 有关Fragment的知识点

    关于判断Fragment是否可见,可以尝试参考使用Fragment中的两个方法: final boolean isHidden() Return true if the fragment has be ...

  8. caffe中关于数据进行预处理的方式

    caffe的数据层layer中再载入数据时,会先要对数据进行预处理.一般处理的方式有两种: 1. 使用均值处理 transform_param { mirror: true crop_size: me ...

  9. spring使用Email邮件系统

    1.提供邮件信息发送接收,附件绑定功能. 1.配置spring-email.xml文件 <context:property-placeholder location="classpat ...

  10. systemctl命令用法详解

    systemctl命令用法详解系统环境:Fedora 16binpath:/bin/systemctlpackage:systemd-units systemctl enable httpd.serv ...