在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
以前一直主要做C++和C方面的项目,对C#不太了解熟悉,但听说不难,也就一直没有在意学习C#方面的知识。今天有个C#项目,需要做些应用的扩展,同时修改一些bug。但看了C#代码,顿时觉得有些不适应了。。。其中印象很深刻的是几部分内容:IEnumerable类型和Parallel并行计算的foreach知识,我觉得C#在这个问题上做的还是很有意思的。
1. IEnumerable: IEnumerable<T>泛型接口支持在制定数据集合上进行迭代操作, 可以理解为一种序列或者集合,里面是某一类型的元素的集合。常用的方法如下:
可以看到,提供的方法很多,也很实用,比如截断一个子序列,或者比较序列是否相等等,都是十分有用的。 而且还可以配合foreach更加简单有效的遍历集合中个各个元素。如: // 对集合中各个元素都进行操作,后续再介绍Parallel Parallel.ForEach(testTables, new ParallelOptions() { MaxDegreeOfParallelism = 2 }, record
2. Parallel语法 在介绍Parallel并行计算之前,还需要先介绍一下Lambda表达式,能读懂Lambda表达式的,一般就很容易读懂Parallel并行编程的代码了。 您可以按照以下示例将此表达式分配给委托类型:
delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 } 泛型委托也可以使用Lambda表达式: 假设有委托: public delegate TResult Func<TArg0, TResult>(TArg0 arg0); 在调用下面的 Func 委托时,该委托将返回 true 或 false 以指示输入参数是否等于 5: Func<int, bool> myFunc = x => x == 5; }); 这个解释就是从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中的函数体。例子: //记录结果用 Parallel.For(0, testData.Count() - 1, (i, loopState) => 这种实现方式既使运行效率得到了提高,而且不需要程序员来维护多线程编程的线程池等内容,大大减轻了多线程编程的困难,提高了编码效率。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论