发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
1. IEnumerable:
IEnumerable<T>泛型接口支持在制定数据集合上进行迭代操作, 可以理解为一种序列或者集合,里面是某一类型的元素的集合。常用的方法如下:
可以看到,提供的方法很多,也很实用,比如截断一个子序列,或者比较序列是否相等等,都是十分有用的。 而且还可以配合foreach更加简单有效的遍历集合中个各个元素。如:
// 对集合中各个元素都进行操作,后续再介绍Parallel
Parallel.ForEach(testTables, new ParallelOptions() { MaxDegreeOfParallelism = 2 }, record=>{ mag.Operate(record.key1, record.Path);});
2. Parallel语法
在介绍Parallel并行计算之前,还需要先介绍一下Lambda表达式,能读懂Lambda表达式的,一般就很容易读懂Parallel并行编程的代码了。
(以下是MSDN复制过来的说明)Lambda 表达式是一个可用于创建委托或表达式树类型的匿名函数。 通过使用 lambda 表达式,可以写入可作为参数或返回为函数调用值的本地函数。 Lambda 表达式对于编写 LINQ 查询表达式特别有用。若要创建 Lambda 表达式,必须在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x的平方。 您可以按照以下示例将此表达式分配给委托类型:
delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 } 标准的写法: (input parameters) => expression, 如: (x, y) => x == y, 其中,左侧是输入参数,右侧相当于函数体。此表达式是返回x和y是否相等的判断表达式。
泛型委托也可以使用Lambda表达式:
假设有委托: public delegate TResult Func<TArg0, TResult>(TArg0 arg0);
可以将委托实例化为 Func<int,bool> myFunc,其中 int 是输入参数,bool 是返回值。 始终在最后一个类型参数中指定返回值。 Func<int, string, bool> 定义包含两个输入参数(int 和 string)且返回类型为 bool 的委托。 在调用下面的 Func 委托时,该委托将返回 true 或 false 以指示输入参数是否等于 5:
Func<int, bool> myFunc = x => x == 5; bool result = myFunc(4); // returns false of course 介绍过Lambda表达式之后,就可以介绍Parallel的并行语法了。 Parallel.ForEach标准的写法: Parallel.ForEach(nonGenericCollection.Cast<object>(), currentElement => { // some code here;
});
这个解释就是从nonGenericCollection.Cast<object>中的每一个元素,都运行后面的Lambda表达式代码,而且是多线程并行方式运行。比起以前的foreach或者for循环效率也很有了很大的提高。例子:
IEnumerable<TRecord> testTables = warehouse.GetList();
Parallel.ForEach(testTables, rec =>
{
mag.operate(rec.key1, rec.key2, rec.key3);
}
);
首先定义一个IEnumerable<TRecord>的记录序列,然后后面定义一个Lambda表达式,参数是rec,函数体是大括号中的内容。也就是对于testTables里的每个元素都并行的运行函数体中的内容。如果函数体中是一个消耗时间比较长的处理事件,比如网络传输数据等内容,则并行将大大提高运行效率。
Parallel.For标准用法:
Parallel.For(int fromInclusive, int toExclusive, Action<int> body);
代表从fromInclusive到toExclusive中的元素,不断的并行的执行body中的函数体。例子:
//记录结果用 List<string> resultData = new List<string>();
Parallel.For(0, testData.Count() - 1, (i, loopState) => { string data = testData[i]; if (data.Contains("a") || data.Contains("abc")) { resultData.Add(data); } });
这种实现方式既使运行效率得到了提高,而且不需要程序员来维护多线程编程的线程池等内容,大大减轻了多线程编程的困难,提高了编码效率。
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
[ASP.NET MVC 小牛之路]02 - C#知识点提要
//用匿名函数定义一个具体的查询需求Func<Product, bool> fruitFilter = delegate(Product prod) { return prod.Category == "水果";};//调用Filter,查询分类为“水果”的商品IEnumer...
Java 8新特性探究(3):解开lambda最强作用的神秘面纱
JSR是Java Specification Requests的缩写,意思是Java 规范请求,Java 8 版本的主要改进是 Lambda 项目(JSR 335),其目的是使 Java 更...
【清晰易懂,现代C++最好用特性之一:Lambda表达式用法详解】
C#中Lamda表达式的用法
C#中Lamda表达式的用法。Lambda表达式出现之前,计算两个int类型变量的和,需要定义一个Add方法,在Main函数中,调用Add方法,传入两个...
十四、Python lambda表达式及用法
十四、Python lambda表达式及用法lambda 表达式是现代编程语言争相引入的一种语法,如果说函数是命名的、方便复用的代码块,那么 lambda 表达式则是功能更灵活的代码块,它可以在程序中被传递和调用。p...
PLINQ即将到来(PFX)
PLINQ即将到来(PFX)PLINQ的编程和LINQ模型一样简单,新的引用库是System.Concurrency.dll,它包括了一个新的接口IParallelEnumerable<T>,当然它也添加了一继承老的IEnumerable的新的集合和数组...
《C#并发编程经典实例》学习笔记—3.1 数据的并行处理
void RotateMatrices(IEnumerable<Matrix> matrices, float degrees){ Parallel.ForEach(matrices, matrix => matrix.void InvertMatrices(IEnumerable<Matrix> matrices){ Parallel.vo...
python常见单词在手,编程入门不愁
python常见单词在手,编程入门不愁。一、交互式环境与print输出。二、字符串的操作。三、重复/转换/替换/原始字符串。四、去除/查询/计...
C# 3.0: LINQ 的演变及其对 C# 设计的影响 (转与 MSDN Magazine)
待查询数据的形式可以是 XML(LINQ 到 XML)、数据库(启用 LINQ 的 ADO.NET,其中包括 LINQ 到 SQL、LINQ 到 Dataset 和 LINQ 到 Entit...
微信扫码,在手机上查看选中内容