2) LINQ编程技术内幕--yield return
yield return 使用.NET的状态机生成器
yield return关键词组自动实现IDisposable,使用这个可枚举的地方, 还存在一个隐含的try finally块. 示例代码:
classProgram{staticvoidMain(string[] args){foreach(int i inGetEvents()){Console.WriteLine(i);}Console.ReadLine();}staticIEnumerable<int>GetEvents(){var integers =new[]{1,2,3,4,5,6,7,8};foreach(int i in integers){if(i%2==0){yieldreturn i;//返回了一个可迭代对象[2,4,6,8].}}}}
yield return意味着可以在任何对象上获得可枚举功能, 而无需编写类型化集合类以及相关的处理代码.
- 一个关于
yield return和yield break(在得到需要的遍历之前而中止的过程. 已中序遍历为例:
publicclassNode<T>where T:IComparable<T>{public T data;privateNode<T> leftNode;publicNode<T>LeftNode{get;set;}privateNode<T> rightNode;publicNode<T>RightNode{get;set;}publicNode(T data){this.data = data;}publicoverridestringToString(){return data.ToString();}}publicclassBinaryTreeNode<T>where T:IComparable<T>{privateNode<T> root;publicNode<T>Root{get;set;}publicvoidAdd(T item){if(root ==null){root =newNode<T>(item);return;}Add(item, root);}privatevoidAdd(T item,Node<T> node){if(item.CompareTo(node.data)<0){if(node.LeftNode==null)node.LeftNode=newNode<T>(item);elseAdd(item, node.LeftNode);}elseif(item.CompareTo(node.data)>0){if(node.RightNode==null)node.RightNode=newNode<T>(item);else{Add(item, node.RightNode);}}}publicvoidAddRange(params T[] items){foreach(var item in items){Add(item);}}publicvoidPrint(){Print(root,0,Console.WindowWidth/2);}publicIEnumerable<T>Inorder{get{returnGetInOrder(this.root);}}int depth =0;/// <summary>/// 中序遍历: 左 根 右/// </summary>/// <param name="node"></param>/// <returns></returns>privateIEnumerable<T>GetInOrder(Node<T> node){//if (depth++ > 4) yield break;//大于4层,则只输出前4层.!!!这块待确认.if(node.LeftNode!=null){foreach(T item inGetInOrder(node.LeftNode)){yieldreturn item;}}yieldreturn node.data;if(node.RightNode!=null){foreach(T item inGetInOrder(node.RightNode)){yieldreturn item;}}}privatevoidPrint(Node<T> item,int depth,int offset){if(item ==null)return;Console.CursorLeft= offset;Console.CursorTop= depth;Console.Write(item.data);if(item.LeftNode!=null)Print("/", depth +1, offset -1);Print(item.LeftNode, depth +2, offset -3);if(item.RightNode!=null)Print("\\", depth +1, offset +1);Print(item.RightNode, depth +2, offset +3);}privatevoidPrint(string s,int depth,int offset){Console.CursorLeft= offset;Console.CursorTop= depth;Console.Write(s);}}classProgram{staticvoidMain(string[] args){BinaryTreeNode<int> integers =newBinaryTreeNode<int>();integers.AddRange(8,5,6,7,3,4,13,21,1,17);integers.Print();Console.ReadLine();Console.Clear();foreach(var item in integers.Inorder){Console.WriteLine(item);}Console.ReadLine();}}
2) LINQ编程技术内幕--yield return的更多相关文章
- Java并发编程与技术内幕:线程池深入理解
摘要: 本文主要讲了Java当中的线程池的使用方法.注意事项及其实现源码实现原理,并辅以实例加以说明,对加深Java线程池的理解有很大的帮助. 首先,讲讲什么是线程池?照笔者的简单理解,其实就是一组线 ...
- 《[MySQL技术内幕:SQL编程》读书笔记
<[MySQL技术内幕:SQL编程>读书笔记 2019年3月31日23:12:11 严禁转载!!! <MySQL技术内幕:SQL编程>这本书是我比较喜欢的一位国内作者姜承尧, ...
- 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)
索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...
- 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)
索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 一.SQL Server体系结构 1.1 数据库 ...
- 【转】COM技术内幕(笔记)
COM技术内幕(笔记) COM--到底是什么?--COM标准的要点介绍,它被设计用来解决什么问题?基本元素的定义--COM术语以及这些术语的含义.使用和处理COM对象--如何创建.使用和销毁COM对象 ...
- 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
//////////////////////////////////////////////////////////////////////////////////// ...
- 2008技术内幕:T-SQL语言基础
2008技术内幕:T-SQL语言基础 单表查询摘记 这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基础>,书中用到的案例数据库是这个 TSQLF ...
- 2008技术内幕:T-SQL语言基础 单表查询摘记
这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基础>,书中用到的案例数据库是这个 TSQLFundamentals2008 ,官网给出的连接是这 ...
随机推荐
- C++学习笔记(八):函数重载、函数指针和函数对象
函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...
- SD卡fat文件系统移植
经过充分的研究,发现fatfs文件系统移植的比较简单!因为代码都已经被别人做好了!我们只需把io层稍稍做个处理就ok了: 至于sd卡的驱动请看我这篇博客:http://blog.csdn.net/ie ...
- 退出程序是跳过屏幕自检 比如 必输 EXIT-COMMAND
控制必须输入可以,但是我退出程序的时候还要求我输入个值才能退出,这太变态了,相信很多同志都在SAP程序中反感过这个问题. 标准程序咱就不说了,忍了,新开发的功能还是要解决这个问题. 办法很简单:MOD ...
- 在与SQL Server建立连接时出现与网络相关的或特定于实例的错误
向往前一样.学习牛腩新闻公布系统的视频,写程序,打开数据库.出现一个框框,具体内容例如以下: 数据库连接不上.全部的工作都要歇班,捣鼓了会儿,简单总结一下解决该问题的方法. 首先:第一步,程序--SQ ...
- ListOrderedMap
要有序能够用List,要便于查找能够用Map,那既要有序又便于查找呢? 近期我就遇到了这样一个问题.Java没有给我们提供现成的类.我们全然能够自己开发个类继承List和Map(Java原来就有不能够 ...
- 【20】宁以pass-by-reference-to-const替换pass-by-value
1.首先理解需求,被调用方法修改了形参,如果期望在主调方法中的实参也发生变化,必须使用pass-by-reference.因为C++缺省情况下(继承C方式),以by-value传递对象,在被调方法中修 ...
- JS字符处理
JS取整 1.toFixed(num)(ps:num为保留小数点后几位) 自定义保留小数点后几位,进行四舍五入.严格来说,这个函数不属于取整,但是当num=0时,也就是取整了,所以一起放到这里,方便查 ...
- Oracle Hints具体解释
在向大家具体介绍Oracle Hints之前,首先让大家了解下Oracle Hints是什么,然后全面介绍Oracle Hints,希望对大家实用.基于代价的优化器是非常聪明的,在绝大多数情况下它会选 ...
- android学习日记28--Android中常用设计模式总结
一.综述 设计模式,根据前人经验总结出常见软件工程问题的解决思想套路.GoF一共归纳了23种设计模式,当然还有人扩充,不止这些.设计模式主要利用面向对象语言的特性,而android 的设计主要用JAV ...
- Struts2中的类型转换
1. Struts2中的类型转换 我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换! 在Struts2中,类型转换的概 ...