LINQ使用与并行

LINQ介绍

参考:https://msdn.microsoft.com/en-us/library/bb397906.aspx

LINQ查询主要执行操作包括:1)获取数据源;2)创建查询;3)执行查询。需要注意的是只有在使用查询结果的时候才会去执行查询,或者在创建查询之后再加上tolist或者toarray之类的功能则可以立即执行。

        // The Three Parts of a LINQ Query:
        //  1. Data source.
        int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

        // 2. Query creation.
        // numQuery is an IEnumerable<int>
        var numQuery =
            from num in numbers
            where (num % 2) == 0
            select num;

        // 3. Query execution.
        foreach (int num in numQuery)
        {
            Console.Write("{0,1} ", num);
        }

数据源可以来自于Array、List等或者直接从文件中读取的结果。

查询语句操作

参考:https://msdn.microsoft.com/en-us/library/bb397927.aspx

Filter: where cust.City==”London” && cust.Name == “Devon”

Order: orderby cust.Name ascending

Group: group cust by cust.City into custGroup where custGroup.Count() > 2

Join: join dist in distributors on cust.City equals dist.City

其他功能

我们在使用LINQ操作的时候,往往还有一些额外的需求,比如去重啊,分组啊等等。

            // The Three Parts of a LINQ Query:
            //  1. Data source.
            int[] numbers = new int[] { 0, 1, 2, 3, 4, 5, 6, 4 };

            // 2. Query creation.
            // numQuery is an IEnumerable<int>
            var numQuery =
                from num in numbers
                where (num % 2) == 0
                select num;

            // 3. Query execution.
            foreach (int num in numQuery.Distinct())
            {
                Console.WriteLine("{0,1} ", num);
            }
            foreach (var num in numQuery.GroupBy(key => key))
            {
                Console.WriteLine("{0}:{1} ", num.Key, num.Count());
            }
            foreach (int num in numQuery.GroupBy(key => key).Select(key => key.Key))
            {
                Console.WriteLine("{0,1} ", num);
            }

并行处理

LINQ比较强大的是还提供了可并行处理的查询,这使得我们可以借助它来完成一些查询或者处理的并行操作。

        static void Main(string[] args)
        {
            // The Three Parts of a LINQ Query:
            //  1. Data source.
            int[] numbers = new int[100];
            for (var i = 0; i < 100; i++)
                numbers[i] = i;

            // 2. Query creation.
            // numQuery is an IEnumerable<int>
            var numQuery =
                from num in numbers
                where (num % 2) == 0
                select num;

            // 3. Query execution.
            Split(numQuery.ToList(), 10)
                .AsParallel()
                .WithDegreeOfParallelism(3)
                .Select(process)
                .ToList();
            Console.ReadKey();
        }

        static Tuple<List<int>, int> process(Tuple<List<int>, int> input)
        {
            foreach (var num in input.Item1)
                Console.WriteLine("{0}-{1}", num, input.Item2);
            return input;
        }

        static IEnumerable<Tuple<List<int>, int>> Split(List<int> nums, int Count)
        {
            int index = 0;
            List<int> num = new List<int>();
            foreach(var nm in nums)
            {
                num.Add(nm);
                if (num.Count >= Count)
                {
                    yield return new Tuple<List<int>, int>(num, index++);
                    num = new List<int>();
                }
            }
            if(num.Count > 0)
            {
                yield return new Tuple<List<int>, int>(num, index++);
            }
        }

详细介绍可以参考:https://msdn.microsoft.com/en-us/library/dd997425(v=vs.110).aspx

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-28 23:48:18

LINQ使用与并行的相关文章

5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq

在上一篇博客5天玩转C#并行和多线程编程 —— 第一天 认识Parallel中,我们学习了Parallel的用法.并行编程,本质上是多线程的编程,那么当多个线程同时处理一个任务的时候,必然会出现资源访问问题,及所谓的线程安全.就像现实中,我们开发项目,就是一个并行的例子,把不同的模块分给不同的人,同时进行,才能在短的时间内做出大的项目.如果大家都只管自己写自己的代码,写完后发现合并不到一起,那么这种并行就没有了意义. 并行算法的出现,随之而产生的也就有了并行集合,及线程安全集合:微软向的也算周到

.NET 实现并行的几种方式(三)

本随笔续接:.NET 实现并行的几种方式(二) 在前两篇随笔中,先后介绍了 Thread .ThreadPool .IAsyncResult (即 APM系列) .Task .TPL (Task Parallel Library). 写到这些笔者突然意识到 还有一个EMP系列没有写,在这里补充一下: 六. EPM .EPM中的典型代表是 WebClient: EPM系列采用 ***Async方法 + ***Completed事件 的编码规范,不做太多解释.具体的demo如下: var addre

C#并行和合买平台搭建并行集合和PLinq

合买平台搭建 并行算法的出现,随之而产生的也就有了并行集合,及线程安全集合:微软向的也算周到,没有忘记linq,也推出了linq的并行版本,plinq - Parallel Linq. 一.并行集合 -- 线程安全集合 并行计算使用的多个线程同时进行计算,所以要控制每个线程对资源的访问,我们先来看一下平时常用的List<T>集合,在并行计算下的表现,新建一个控制台应用程序,添加一个PEnumerable类(当然你也直接写到main方法里面测试,建议分开写),写如下方法: 复制代码 using

并行编程(Parallel Framework)

前言 并行编程:通过编码方式利用多核或多处理器称为并行编程,多线程概念的一个子集. 并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程.多线程的一种. 并行编程分为如下几个结构: 1.并行的LINQ或PLINQ 2.Parallel类 3.任务并行结构 4.并发集合 5.SpinLock和SpinWait 这些是.NET 4.0引入的功能,一般被称为PFX(Parallel Framework,并行框架). Parallel类和任务并行结构称为TPL(Task Parallel

C#综合揭秘——细说多线程(下)

引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发.其中委托的BeginInvoke方法以及回调函数最为常用.而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作.特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax或者在服务器端使用UpdatePanel.其实合理使用I/O线程在通讯项目或文件下载时,能尽量降低IIS的压力.并行编程是Framework4.0中极力推广的

十四、C# 支持标准查询运算符的集合接口

支持标准查询运算符的集合接口. System.Linq.Enumeralbe类提供的一些常用的API 来执行集合处理 1.匿名类型 2.隐匿类型的局部变量 3.集合初始化器 4.集合 5.标准查询运算符 本章主要讨论泛型集合接口. 非泛型的集合类,待查. 一.匿名类型和隐式类型的局部变量声明 C#3.0增强. 1.匿名类型 一种特殊的数据类型,它最终是由编译器声明的,而非通过已定义好的类来声明的. 和匿名函数相似,当编译器看到一个匿名类型时,会自动执行一些后台操作,生成必要的代码, 允许像显式声

C# 多线程

引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发.其中委托的BeginInvoke方法以及回调函数最为常用.而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作.特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax或者在服务器端使用UpdatePanel.其实合理使用I/O线程在通讯项目或文件下载时,能尽可能地减少IIS的压力.并行编程是Framework4.0中极力推

C#学习笔记13

1.Task概述:Task是对操作系统线程的抽象,目的是使线程池能高效地管理线程的分配和回收,Task使用的底层线程属于一种共享资源,任务需要互相协作,并及时归还线程,以便用相同的共享资源(线程)满足其他请求. 2.Task.AsyncState:获取在创建 Task 时提供的状态对象,如果未提供,则为 null.若状态对象在task内部改变了,AsyncState的数据也是改变后的状态对象.可查看ThreadApply.TaskAsyncState()方法的代码. 3.Task.Continu

读书笔记—CLR via C#线程25-26章节

前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可以加深自己理解的深度,当然同时也和技术社区的朋友们共享 线程 线程内部组成 线程内核对象 thread kernel object,在该结构中,包含一组对线程进行描述的属性.数据结构中还包括所谓的线程上下文thread context.上下文是一个内存块,包含了CPU的寄存器集合,占用几百到几千个字