.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. Spring MVC 返回类型为字符串时, 返回中文变成"?"处理

    Spring controller 如下 @Controller public class SimpleController { @ResponseBody @RequestMapping(value ...

  2. 修改VIM恶心的注释自动格式化

    我复制一段代码,里面有// 只有一行,但是复制到vim中就下面全部都有//了.我要取消这个功能 vim ~/.vimrc set nu! "set formatoptions=croql 这 ...

  3. The Art of Deception

    前言 一些黑客毁坏别人的文件甚至整个硬盘,他们被称为电脑狂人(crackers)或计算机破坏者(vandals).另一些新手省去学习技术的麻烦,直接下载黑客工具侵入别人的计算机,这些人被称为脚本小子( ...

  4. c#利用SWIG调用c++dll学习总结【转】

    开发环境: 操作系统:windows 7 IDE:Microsoft Visual Studio Professional 2015 SWIG: 3.0.12 swig的介绍 详细介绍可看官网,一下贴 ...

  5. 如何使用.net访问Access数据库 (转)

    前言:今天整理程序,看到之前写的一个Demo,也不知道是从哪里参考的了,写到这里,留作备用吧. 使用.net访问Access数据库:1.BL层:新增一个DataAccess类. Code].Defau ...

  6. TNTSearch 轻量级全文索引 + 中文分词

    TNTSearch 轻量级全文索引+中文分词 选用 TNTSearch 的原因:轻,方便移植,不需要额外安装服务,能减少后期维护的工作量.搜索的效果也还不错,可以满足大多数项目场景,如果对性能和精准度 ...

  7. Nginx网站常见的跳转配置实例

    相信大家在日常运维工作中如果你用到nginx作为前端反向代理服务器的话,你会对nginx的rewrite又爱又恨,爱它是因为你搞定了它,完成了开发人员的跳转需求后你会觉得很爽,觉得真的很强大,恨它是因 ...

  8. 集成学习总结 & Stacking方法详解

    http://blog.csdn.net/willduan1/article/details/73618677 集成学习主要分为 bagging, boosting 和 stacking方法.本文主要 ...

  9. THINKPHP 错误:Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'

    最近公司同事将我之前使用Thinkphp开发的一个项目从香港迁移到国内阿里云服务器上去,结果网站所有地址打开全部一片空白 跟同事确认了PHP版本,Mysql版本等都是跟迁移前的配置一样的,最终经过我查 ...

  10. iOS开发点滴 - 关闭键盘

    有时候系统显示的键盘会挡住视图中某些重要的控件,这个时候当用户按下换行键,就应该取消UITextField对象的第一响应(First Responder)状态而关闭键盘. 1. 首先,视图控制器必须遵 ...