.NET(C#):警惕PLINQ结果的无序性

2012年08月10日 ⁄ 综合 ⁄ 共 620字 ⁄ 字号    ⁄ 评论关闭
 

PLINQ的运行结果是无序的,也就是不保持原来集合的顺序来操作(当然除了一些专门的排序操作)。原因则是线程的并发执行本来就充满了不确定性,把原来一个任务分割成好几个部分同时进行返回的结果会打乱原来的顺序,如果要强制保留顺序,肯定要浪费一些性能,PLINQ是可以这样的,但默认不这样。

先看一个LINQ示例:

var arr = new int[] { 1, 2, 3, 4, 5 };

var res = arr.Where(i => i != 3);

结果是:

1, 2, 4, 5

顺序是保持的。而PLINQ:

var res = arr.AsParallel().Where(i => i != 3);

结果顺序变了:

1, 4, 5, 2

使用PLINQ的AsOrdered和AsUnordered可以命令PLINQ执行保留原集合顺序或者不保留。

把上面的PLINQ改成:

var res = arr.AsParallel().AsOrdered().Where(i => i != 3);

结果就是:1, 2, 4, 5了。

不过如果对PLINQ集合进行了排序那么后续操作会自动保持顺序,就像调用了AsOrdered。

var res = arr.AsParallel().OrderBy(i => i).Where(i => i != 3);

结果也是:1, 2, 4, 5了。

注意某些PLINQ方法如果没有保持顺序执行意义不大,比如Reverse方法:

var res = arr.AsParallel().Reverse();

结果会是:

5, 3, 2, 1, 4

.NET(C#):警惕PLINQ结果的无序性的更多相关文章

  1. 从集合的无序性看待关系型数据库中的"序"

    本文目录:1.集合的特征2.集合的无序性3.表中记录的无序性4.集合的"序"和物理存储顺序之间的关系5.查询结果(虚拟表)的无序性.随机性6.为什么总是强调"无序&quo ...

  2. redis:set集合类型的操作(无序集合)

    1. set集合类型的操作(无序集合) 集合具有无序性(没有顺序).确定性(描述是确定的).唯一性(没有重复的元素) 1.1. sadd key member [member ...] 语法:sadd ...

  3. 告知你不为人知的UDP-连接性和负载均衡

    版权声明:本文由黄日成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/812444001486438028 来源:腾云阁 h ...

  4. Redis之无序集合类型命令

    Redis 集合(Set) Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中集合是通过哈希表实现的,所以添加,删除,查找 ...

  5. iOS NSSet 学习 “无序数组” & 去重 案例

    “NSSet,NSMutableSet,和NSCountedSet类声明编程接口对象的无序集合(散列存储:在内存中的存储位置不连续). 而NSArray,NSDictionary类声明编程接口对象的有 ...

  6. 分布式场景下Kafka消息顺序性的思考

    如果业务中,对于kafka发送消息异步消费的场景,在业务上需要实现在消费时实现顺序消费, 利用kafka在partition内消息有序的特点,消息消费时的有序性. 1.在发送消息时,通过指定parti ...

  7. C#并行编程-并发集合

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  8. C#并行编程 z

    目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-PLINQ:声明式数据并行 背景 基于任务的程序 ...

  9. 学习javascript数据结构(三)——集合

    前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...

随机推荐

  1. docker logs-查看docker容器日志

    只限制最后100条的日志,并持续更新日志显示 docker logs -f --tail= CONTAINER_ID docker logs -f --tail CONTAINER_ID   http ...

  2. Spring Boot集成JasperReports生成PDF文档

    由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲染生成PDF文档.本人文采欠缺,写作能力 ...

  3. Android -- TypedArray

    当我们自定义View的时候,在给View赋值一些长度宽度的时候,一般都是在layout布局文件中进行的.,比如android:layout_height="wrap_content" ...

  4. 条件随机场(CRF)理论及应用

    http://x-algo.cn/index.php/2016/02/15/conditional-random-field-crf-theory-and-implementation/ 条件随机场( ...

  5. Centos6.4下安装protobuf及简单使用

    1.protobuf是google公司提出的数据存储格式,详细介绍可以参考:https://code.google.com/p/protobuf/ 2.下载最新的protobuf,下载地址:https ...

  6. idea 提交代码时提示 please tell me who you are .......

  7. ASP入门(十七)-ASP #include

    通过使用 #include 指令,您可以在服务器执行 ASP 文件之前,把另一个 ASP 文件的内容插入到这个 ASP 文件中. 如何使用 #include 指令 这里有一个名为 mypage.asp ...

  8. ASP入门(六)-Response对象

    Response对象可以从服务器向用户发送输出的结果. Response几种常用方法 方法 描述 BinaryWrite 向浏览器输出二进制的内容 Clear 清除已经缓冲的HTML输出 End 停止 ...

  9. Python爬虫实战(一):爬糗事百科段子

    代码: # _*_ coding:utf-8 _*_ import urllib2 import re from datetime import datetime class QSBK: def __ ...

  10. C#.NET常见问题(FAQ)-如何使用右下角托盘图标notifyIcon

    1 拖放一个NotifyIcon控件,并设置图标,还有显示的文字   2 双击这个控件,即当最小化了主窗体,然后双击这个右下角图标的时候,要显示主窗体(大部分程序的用户体验都是这样干的,比如QQ,双击 ...