• 2) LINQ编程技术内幕--yield return


    yield return 使用.NET的状态机生成器

    • yield return关键词组自动实现IDisposable,使用这个可枚举的地方, 还存在一个隐含的try finally块. 示例代码:
    •  ```
      1. classProgram
      2. {
      3. staticvoidMain(string[] args)
      4. {
      5. foreach(int i inGetEvents())
      6. {
      7. Console.WriteLine(i);
      8. }
      9. Console.ReadLine();
      10. }
      11. staticIEnumerable<int>GetEvents()
      12. {
      13. var integers =new[]{1,2,3,4,5,6,7,8};
      14. foreach(int i in integers)
      15. {
      16. if(i%2==0)
      17. {
      18. yieldreturn i;//返回了一个可迭代对象[2,4,6,8].
      19. }
      20. }
      21. }
      22. }
    • ```

    yield return意味着可以在任何对象上获得可枚举功能, 而无需编写类型化集合类以及相关的处理代码.

    • 一个关于yield returnyield break(在得到需要的遍历之前而中止的过程. 已中序遍历为例:
    1. publicclassNode<T>where T:IComparable<T>
    2. {
    3. public T data;
    4. privateNode<T> leftNode;
    5. publicNode<T>LeftNode{get;set;}
    6. privateNode<T> rightNode;
    7. publicNode<T>RightNode{get;set;}
    8. publicNode(T data)
    9. {
    10. this.data = data;
    11. }
    12. publicoverridestringToString()
    13. {
    14. return data.ToString();
    15. }
    16. }
    17. publicclassBinaryTreeNode<T>where T:IComparable<T>
    18. {
    19. privateNode<T> root;
    20. publicNode<T>Root{get;set;}
    21. publicvoidAdd(T item)
    22. {
    23. if(root ==null)
    24. {
    25. root =newNode<T>(item);
    26. return;
    27. }
    28. Add(item, root);
    29. }
    30. privatevoidAdd(T item,Node<T> node)
    31. {
    32. if(item.CompareTo(node.data)<0)
    33. {
    34. if(node.LeftNode==null)
    35. node.LeftNode=newNode<T>(item);
    36. else
    37. Add(item, node.LeftNode);
    38. }
    39. elseif(item.CompareTo(node.data)>0)
    40. {
    41. if(node.RightNode==null)
    42. node.RightNode=newNode<T>(item);
    43. else
    44. {
    45. Add(item, node.RightNode);
    46. }
    47. }
    48. }
    49. publicvoidAddRange(params T[] items)
    50. {
    51. foreach(var item in items)
    52. {
    53. Add(item);
    54. }
    55. }
    56. publicvoidPrint()
    57. {
    58. Print(root,0,Console.WindowWidth/2);
    59. }
    60. publicIEnumerable<T>Inorder
    61. {
    62. get{returnGetInOrder(this.root);}
    63. }
    64. int depth =0;
    65. /// <summary>
    66. /// 中序遍历: 左 根 右
    67. /// </summary>
    68. /// <param name="node"></param>
    69. /// <returns></returns>
    70. privateIEnumerable<T>GetInOrder(Node<T> node)
    71. {
    72. //if (depth++ > 4) yield break;//大于4层,则只输出前4层.!!!这块待确认.
    73. if(node.LeftNode!=null)
    74. {
    75. foreach(T item inGetInOrder(node.LeftNode))
    76. {
    77. yieldreturn item;
    78. }
    79. }
    80. yieldreturn node.data;
    81. if(node.RightNode!=null)
    82. {
    83. foreach(T item inGetInOrder(node.RightNode))
    84. {
    85. yieldreturn item;
    86. }
    87. }
    88. }
    89. privatevoidPrint(Node<T> item,int depth,int offset)
    90. {
    91. if(item ==null)return;
    92. Console.CursorLeft= offset;
    93. Console.CursorTop= depth;
    94. Console.Write(item.data);
    95. if(item.LeftNode!=null)
    96. Print("/", depth +1, offset -1);
    97. Print(item.LeftNode, depth +2, offset -3);
    98. if(item.RightNode!=null)
    99. Print("\", depth +1, offset +1);
    100. Print(item.RightNode, depth +2, offset +3);
    101. }
    102. privatevoidPrint(string s,int depth,int offset)
    103. {
    104. Console.CursorLeft= offset;
    105. Console.CursorTop= depth;
    106. Console.Write(s);
    107. }
    108. }
    109. classProgram
    110. {
    111. staticvoidMain(string[] args)
    112. {
    113. BinaryTreeNode<int> integers =newBinaryTreeNode<int>();
    114. integers.AddRange(8,5,6,7,3,4,13,21,1,17);
    115. integers.Print();
    116. Console.ReadLine();
    117. Console.Clear();
    118. foreach(var item in integers.Inorder)
    119. {
    120. Console.WriteLine(item);
    121. }
    122. Console.ReadLine();
    123. }
    124. }





  • 相关阅读:
    负外边距--转载
    研究Dropbox Server端文件系统
    Bluetooth Profile for iPhone from the functional perspectives
    Somebody That I Used to Know
    复合查询
    聚合查询
    Filter查询
    ES基本查询
    ES版本控制
    ES基本操作
  • 原文地址:https://www.cnblogs.com/hijushen/p/5394845.html
Copyright © 2020-2023  润新知