/// <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;
}
}
}
}