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);
else
Add(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 ,官网给出的连接是这 ...
随机推荐
- IOS应用安全(五):高级Runtime分析和操作
在前一篇文章,我们学习如何安装Cycript在你的苹果设备,hook进程获取其相关属性信息.这一篇文章,我们将介绍高级的runtime分析技术,在应用运行时获取或者修改指定class的信息(方法.实例 ...
- PowerDesigner 物理数据模型(PDM)
PowerDesigner 物理数据模型(PDM) 说明 数据库脚本sqldatabasegeneration存储 目录(?)[+] 一. PDM 介绍 物理数据模型(Physical ...
- 使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务
原文地址:http://www.ibm.com/developerworks/cn/web/wa-restful/ 简介: Spring,构建 Java™ 平台和 Enterprise Edition ...
- 基础数据结构 之 树(python实现)
树是数据结构中常用到的一种结构,其实现较栈和队稍为复杂一些.若树中的所有节点的孩子节点数量不超过2个,则该为一个二叉树.二叉树可用于查找和排序等.二叉树的主要操作有:建树,遍历等.遍历是树中的一个最为 ...
- ThinkPHP3.1快速入门(13)自动完成
自动完成是ThinkPHP提供用来完成数据自动处理和过滤的方法,使用create方法创建数据对象的时候会自动完成数据处理.因此,在ThinkPHP使用create方法来创建数据对象是更加安全的方式,而 ...
- linux中文输入法
rpm方式.在安装盘上已经有各种语言包了.我们仅仅须要找到他们,并安装就能够了. 中文的是 fonts-chinese-3.02-9.6.el5.noarch.rpm fonts-ISO8859-2- ...
- Tomcat 集群
1. 前言 该篇中测试的机器发生了变更,在第一篇中设置的Apache DocumentRoot "d:/deployment"修改为了DocumentRoot d:/clust ...
- css中那些你可能没注意到的东西
1.inline元素,添加position:absolute;可定宽高,position:relative;则不行,不信你试试! 2.inline元素添加浮动后,不用加display:block;也可 ...
- 进程关系之tcgetpgrp、tcsetpgrp和tcgetsid函数
需要有一种方法来通知内核哪一个进程组是前台进程组,这样,终端设备驱动程序就能了解将终端输入和终端产生的信号送到何处. #include <unistd.h> pid_t tcgetpgrp ...
- [原创] 对于深度学习(deep learning)在工业界的应用现状和突破 [by matthewbai]
现状: 1. 目前大家对于大部分需求,通常采用multiple layer,units in each layer也是人工订好的(虽然可以做稀疏,但是在same layer范围内竞争). 2. 网络结 ...