设计模式——迭代器模式

来源:互联网 发布:女性假两性畸形 知乎 编辑:程序博客网 时间:2024/05/20 05:03
/// <summary>        /// 测试枚举器        /// </summary>        private static void TestItemerator()        {            var family = new Tree<Person>(new Node<Person>(new Person { Name = "Mr.Zhao", Birthday = "1983-01-13" },                new Node<Person>(new Person { Name = "Mr.Zhao's Son1", Birthday = "2012-01-12" },                    new Node<Person>(new Person { Name = "Son1's Son11", Birthday = "2025-01-11" }, null, null),                    new Node<Person>(new Person { Name = "Son1's Son12", Birthday = "2025-01-11" }, null, null)),                new Node<Person>(new Person { Name = "Mr.Zhao's Son2", Birthday = "2012-01-12" },                    new Node<Person>(new Person { Name = "Son2's Son21", Birthday = "2025-01-11" }, null, null),                    new Node<Person>(new Person { Name = "Son2's Son22", Birthday = "2025-01-11" }, null, null))));            foreach (var p in family.Preorder)                Console.WriteLine("{0}=>{1}", p.Name, p.Birthday);            family.Where(p => string.Compare(p.Birthday, "2014-01-13") > 0).ToList().ForEach(p =>            {                Console.WriteLine("家族成员【{0}=>{1}】在2014-01-13之后出生", p.Name, p.Birthday);            });        }


1、树节点定义:

/// <summary>    /// 泛型树节点    /// </summary>    /// <typeparam name="T"></typeparam>    public 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;        }    }
2、树定义:
/// <summary>    /// 树:根节点、构造函数    /// </summary>    /// <typeparam name="T"></typeparam>    public class Tree<T>    {        Node<T> root;        public Tree() { }        public Tree(Node<T> head)        {            this.root = head;        }        public IEnumerable<T> Preorder        {            get { return ScanPreorder(root); }        }        /// <summary>        /// 带委托的过滤器        /// </summary>        /// <param name="filter">带条件的委托方法,返回真假</param>        /// <returns></returns>        public IEnumerable<T> Where(Func<T,bool> filter)        {             foreach(var p in ScanPreorder(root))            {                if (filter(p))                    yield return p;            }        }        /// <summary>        /// 遍历树节点        /// (前序遍历:根=>左节点=>右节点)        /// </summary>        /// <param name="root"></param>        /// <returns></returns>        private IEnumerable<T> ScanPreorder(Node<T> root)        {            yield return root.Data;            if (root.Left != null)            {                foreach (var p in ScanPreorder(root.Left)) //所有左子树                {                    yield return p;                }            }            if (root.Right != null)            {                foreach (var r in ScanPreorder(root.Right))//所有右子树                {                    yield return r;                }            }        }    }

0 0
原创粉丝点击