• iteratorfamilytree.cs


      using System;
      using System.Collections;
      using System.Collections.Generic;
      using System.Linq;

      //  Iterator Pattern Example        Judith Bishop   September 2007
      //  Illustrates the use of LINQ with iterators on a tree structure
     
      class Person {
        public Person() {}
        public string Name {get; set;}
        public int Birth {get; set;}

        public Person (string name, int birth) {
          Name = name;
          Birth = birth;
        }

        public override string ToString () {
          return ("["+Name+", "+Birth+"]");
        }
      }

      class Node <T> {
        public Node () {}
        public Node <T> Left{get; set;}
        public Node <T> Right {get; set;}
        public T Data {get; set;}

        public Node (T d, Node <T> left, Node <T> right) {
          Data = d;
          Left = left;
          Right = right;
        }
      }

      // T is the data type. The Node type is built-in
      class Tree <T>  {
        Node <T> root;
        public Tree() {}
        public Tree (Node <T> head) {
          root = head;
        }

        public IEnumerable <T> Preorder {
          get {return ScanPreorder (root);}
        }

        //  Enumerator with Filter
        public IEnumerable <T> Where (Func <T, bool> filter){
          foreach (T p in ScanPreorder(root))
            if (filter(p)==true)
              yield return p;
        }

        // Enumerator with T as Person
        private IEnumerable <T> ScanPreorder (Node <T> root) {
          yield return root.Data;
          if (root.Left !=null)
            foreach (T p in ScanPreorder (root.Left))
              yield return p;
          if (root.Right !=null)
            foreach (T p in ScanPreorder (root.Right))
              yield return p;
        }
      }

      class IteratorPattern {

      // Iterator Pattern for a Tree     Judith Bishop  September 2007
      // Shows two enumerators using links and recursion

        static void Main() {
          var family = new Tree <Person> ( new Node <Person>
            (new Person ("Tom", 1950),
              new Node <Person> (new Person ("Peter", 1976),
                new Node <Person>
                  (new Person ("Sarah", 2000), null,
                new Node <Person>
                  (new Person ("James", 2002), null,
                null)// no more siblings James
              ),
              new Node <Person>
                (new Person ("Robert", 1978), null,
              new Node <Person>
                (new Person ("Mark", 1980),
                  new Node <Person>
                    (new Person ("Carrie", 2005), null, null),
                  null)// no more siblings Mark
                )),
              null) // no siblings Tom
            );

            Console.WriteLine("Full family");
            foreach (Person p in family.Preorder)
              Console.Write(p+"  ");
            Console.WriteLine("\n");

            // Older syntax
            var selection = family.
              Where(p=> p.Birth > 1980);

            // New syntax
            selection = from p in family
                where p.Birth > 1980
                orderby p.Name
                select p;
                  
            Console.WriteLine("Born after 1980 in alpha order");
            foreach (Person p in selection)
                Console.Write(p+"   ");
            Console.WriteLine("\n");
        }
      }

  • 相关阅读:
    做足以让自己骄傲的活
    Count(*) 与 count(field) 一样吗?
    Explain Plan试分析
    Oracle SQL Developer中查看解释计划Explain Plan的两种方法
    整理+学习《骆昊-Java面试题全集(上)》
    【转】Java就业指导
    如何清晰的、高质量的给面试官介绍自己的电商项目【借鉴】
    留存的图片
    Linux学习_006_JavaEE程序员常用linux命令整理
    给Linux初学者的七个建议,值得一读
  • 原文地址:https://www.cnblogs.com/shihao/p/2490380.html
Copyright © 2020-2023  润新知