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();
}
}