在 PLINQ 中,还可以使用 foreach 执行查询以及循环访问结果。 但是,foreach 本身不会并行运行,因此,它要求将所有并行任务的输出合并回该循环正在上面运行的线程中。 在 PLINQ 中,在必须保留查询结果的最终排序,以及以按串行方式处理结果时,例如当为每个元素调用 Console.WriteLine 时,则可以使用 foreach。 为了在无需顺序暂留以及可自行并行处理结果时更快地执行查询,请使用 ForAll 方法执行 PLINQ 查询。

ForEach:进行顺序迭代,不执行并行

ForAll:并行任务

测试代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace parallelTests
{
class MainClass
{ public static object _locker = new object ();
public static void Main (string[] args)
{
Console.WriteLine ("Hello World!"); var lstData = new List<string>{ "a","b","c","d" }; lstData.AsParallel().ForEach (x => { Thread.Sleep(*); Console.WriteLine("this is:{0}",x); }); Console.ReadKey ();
return; //非并行
lstData.ForEach (x => {
lock (_locker) {
Thread.Sleep(*);
}
Console.WriteLine("this is:{0}",x); }); // 并行 lstData.AsParallel().ForAll (x => { //1 同步locker
lock (_locker) {//--并行locker
Thread.Sleep(*);
} //2 use 并行
Thread.Sleep(*); Console.WriteLine("this is:{0}",x); }); Console.ReadKey (); }
} public static class ForEachExtension
{
//示范: this.GetControls<Button>(null).ForEach(b => b.Enabled = false);
/// <summary>
/// 变量枚举元素 并执行Action
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <param name="action"></param>
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
if (source is ParallelQuery<T>)
{
throw new Exception("ParallelQuery Not Support This Extentsion!");
}
foreach (var item in source)
action(item);
} /// <summary>
/// 在使用可迭代类型结合进行Count()的替代
/// 防止 yield return 带来的性能问题
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <returns></returns> public static bool IsEmpty<T>(this IEnumerable<T> source)
{
if (null==source)
{
return true;
}
return !source.Any();
}
public static bool IsNotEmpty<T>(this IEnumerable<T> source)
{
if (null == source)
{
return false;
}
return source.Any();
} public static T[] Remove<T>(this T[] objects, Func<T, bool> condition)
{
var hopeToDeleteObjs = objects.Where(condition); T[] newObjs = new T[objects.Length - hopeToDeleteObjs.Count()]; int counter = ;
for (int i = ; i < objects.Length; i++)
{
if (!hopeToDeleteObjs.Contains(objects[i]))
{
newObjs[counter] = objects[i];
counter += ;
}
} return newObjs;
}
} }

PLINQ的 ForAll 对比集合的ForEach的更多相关文章

  1. MyBatis参数传入集合之foreach动态sql

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有item,index,collection,open,separator,close.ite ...

  2. MyBatis参数传入集合之foreach用法

    传入集合list // 账户类型包括门店和分公司 List<Object> scopeList = new ArrayList<Object>(); scopeList.add ...

  3. 使用yield关键字让自定义集合实现foreach遍历

    一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代 ...

  4. .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化

    1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...

  5. 集合、拆箱、装箱、自定义集合的foreach

    集合部分 参考:http://msdn.microsoft.com/zh-cn/library/0ytkdh4s(v=vs.110).aspx 集合类型是诸如哈希表.队列.堆栈.包.字典和列表等数据集 ...

  6. C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能

    1.IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环 ...

  7. MyBatis 批量操作、集合遍历-foreach

    在使用mybatis操作数据库时,经常会使用到批量插入.IN条件查询的情况,这时就难免要使用到foreach元素.下面一段话摘自mybatis官网: foreach 元素的功能是非常强大的,它允许你指 ...

  8. Java中数组和集合的foreach操作编译后究竟是啥

    今天和同事在关于foreach编译后是for循环还是迭代器有了不同意见,特做了个Demo,了解一下. 是啥自己来看吧! public class Demo { public static void m ...

  9. C# 通过IEnumberable接口和IEnumerator接口实现泛型和非泛型自定义集合类型foreach功能

    IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环,如 ...

随机推荐

  1. Windows核心编程读书笔记1

    今天特别困啊,这是为什么?!!刚刚把第一章看了一下,困到不行,所以写blog清醒一下. 第一章标题是“错误处理”,看了之后吓了一跳,难道第一章就讲这么高大上的东西?!不是不是,我现在的理解是,这章主要 ...

  2. Java继承与多态

    感慨一下,到了现在感觉Java里面很多东西都是模模糊糊,不能这样了,一点点解决吧.今天看了继承与多态的一些内容,感觉看得很浅,先写下来,算是巩固,如果后面看到更好的内容,再慢慢加上去. 继承与多态,他 ...

  3. ruby写一个文件内容相似性比较的代码

    1.相似度定义 我们定义,则,我们设,则,|C|=s,则相似度p=,p(0,1) 2.相似度检测算法设计 算法设计: 定义4个字符为一个字符串,将T1,T2分割成若干字符串,若剩余字符不足4个,则以空 ...

  4. Ibatis和Hibernate的比较

    Ibatis和Hibernate的比较 分类: IBATIS HIBERNATE2010-11-19 17:58 341人阅读 评论(0) 收藏 举报 hibernateibatis数据库sqlcac ...

  5. 公司内网搭建代理DNS使用内网域名代替ip地址

    企业场景 一般在企业内部,开发.测试以及预生产都会有一套供开发以及测试人员使用的网络环境.运维人员会为每套环境的相关项目配置单独的Tomcat,然后开放一个端口,以 IP+Port 的形式访问.然而随 ...

  6. 算法竞赛之递归——输出1-n的所有排列

    本文是博主原创文章,未经允许不得转载.我的csdn博客也同步发布了此文, 链接 https://blog.csdn.net/umbrellalalalala/article/details/79792 ...

  7. Scala编程入门---函数过程,Lazy值和异常

    过程: 在Scala中,定义函数时,如果函数体直接包裹在花括号里面,而没有使用=连接,则函数的返回值类型就是Unit.这样的函数就被称之为过程. 过程通常用于不需要返回值类型的函数. 过程还有一种写法 ...

  8. sql语句联表更新(从一个数据库中的一张表更新到另一个数据库的另一张表)

    一.sql server数据库写法: update a set a.ksgmm=b.ksgmm,a.ksgm=b.ksgm,a.scztm=b.scztm,a.sczt=b.sczt from lan ...

  9. cocos2d-x 欢乐捕鱼游戏总结

    这几天一直都在做一个捕鱼游戏Demo,大概花掉了我快一个礼拜的时间.游戏主体是使用的cocos2d-x高级开发教程里面提供的小部分框架基本功能.然后自己加入所有的UI元素和玩法.变成了一个体验不错的捕 ...

  10. Vimium快捷键记录

    作为一个Geek必备的技能 从今天起在这里仅记录下使用过的快捷键和心得(翻译自 ?) version: 1.59 版本不同,快捷键有所不同 1. 下载安装地址(自备梯子) Chrome商店:https ...