WEB开发网
开发学院软件开发C语言 c#扩展方法奇思妙用高级篇七:“树”通用遍历器 阅读

c#扩展方法奇思妙用高级篇七:“树”通用遍历器

 2010-09-30 21:03:57 来源:WEB开发网   
核心提示:先看一个简单的类People(将作为测试用的例子):1publicabstractclassPeople2{3publicboolIsMale{get;privateset;}4publicabstractIEnumerable<People>Children{get;}5}People类有一个Childr

先看一个简单的类People(将作为测试用的例子):

1     public abstract class People
2     {
3         public bool IsMale { get; private set; }
4         public abstract IEnumerable<People> Children { get; }
5     }

People类有一个Children属性,返回该People的所有孩子。People类通过Children属性最终可形成一个People树。

“树”的通用遍历扩展参照如下:

 1     public static IEnumerable<T> GetDescendants<T>(this T root, 
 2         Func<T, IEnumerable<T>> childSelector, Predicate<T> filter)
 3     {
 4         foreach (T t in childSelector(root))
 5         {
 6             if (filter == null || filter(t))
 7                 yield return t;
 8             foreach (T child in GetDescendants((T)t, childSelector, filter))
 9                 yield return child;
10         }
11     }

使用People类,写出几个调用示例:

1     People people;
2     //
3     //获取所有子孙
4      var descendants = people.GetDescendants(p => p.Children, null);
5     //获取所有男性子孙
6     var males = people.GetDescendants(p => p.Children, p => p.IsMale);

1 2 3  下一页

Tags:扩展 方法 奇思

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接