享受代码,享受人生

SOA is an integration solution. SOA is message oriented first.
The Key character of SOA is loosely coupled. SOA is enriched
by creating composite apps.
posts - 207, comments - 2294, trackbacks - 132, articles - 44
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

CollectionClosureMethod in .Net

Posted on 2005-08-02 13:13 idior 阅读(1943) 评论(5)  编辑 收藏 所属分类: Windbey
Martin Fowler昨天发布了一篇有关Collection Closure的文章, 文中以Ruby为例展示了Collection Closure的强大,方便. 对照着他的例子, Demo了一下在C#中如何实现类似的功能.

Example 1

employees.each do |e|
    e.doSomething
  end

   31    employees.ForEach(delegate(Employee e)

   32                             {

   33                                 e.DoSomething();

   34                             });


Example 2

managers = employees.select {|e| e.manager?}

   36   List<Employee> managers = employees.FindAll(delegate(Employee e)

   37                                                     {

   38                                                         return e.IsManager == true;

   39                                                     });


Example 3

offices = employees.collect {|e| e.office}

   43  List<Office> offices = employees.ConvertAll<Office>(delegate(Employee e)

   44                                                     {

   45                                                         return e.Office;

   46                                                     });


Example 4

managersOffices = employees.select{|e| e.manager?}.map {|m| m.office}

   48  List<Office> managerOffices = employees.FindAll(delegate(Employee e)

   49                                                     {

   50                                                         return e.IsManager == true;

   51                                                     }).ConvertAll<Office>(delegate(Employee e)

   52                                                     {

   53                                                         return e.Office;

   54                                                     });


Example 5

allManagers = employees.all? {|e| e.manager?}
noManagers = ! employees.any? {|e| e.manager?}


   56   bool allManagers = employees.TrueForAll(delegate(Employee e)

   57                                                     {

   58                                                         return e.IsManager == true;

   59                                                     });

   60   bool noManager = employees.TrueForAll(delegate(Employee e)

   61                                                    {

   62                                                        return e.IsManager == false;

   63                                                    });


Example 6

sortedEmployees = employees.sort {|a,b| a.lastname <=> b.lastname}

   64 employees.Sort(delegate(Employee a, Employee b)

   65                                               {

   66                                                   return a.Age.CompareTo(b.Age);                                              

   67                                               });


Example 7

total = employees.inject(0) {|result, e| result += e.salary}

   68             double  total = 0;

   69             employees.ForEach(delegate(Employee e)

   70                            {

   71                                total += e.Salary;

   72                            });


未实现的功能:
1.   sortedEmployees = employees.sort_by {|e| e.lastname}  指定sort属性
2.   managers, plebs = employees.partition{|e| e.manager?}   多重赋值

可以看出通过C# 2.0对泛型集合提供的新方法以及对匿名方法的支持,使得它也能方便的实现Closure.

Feedback

#1楼    回复  引用  查看    

2005-08-03 10:03 by Ninputer      
遗憾的是,Generic Dictionary和其他特殊泛型集合没有提供类似的方法。而且,倘若不支持匿名方法,那么此类新方法的意义立马就降低了,因为要对每次使用单独写一个函数,而且只是为了在这个有限的上下文中使用一次。为了实现各自的功能写一堆小函数在类里面着实丑陋。(而目前,VS中只有C#支持匿名方法)

#2楼 [楼主]   回复  引用  查看    

2005-08-03 11:18 by idior      
哈哈 总算有让你这个VB fans郁闷的时候了 ^_^

#3楼    回复  引用  查看    

2005-08-03 12:51 by Ninputer      
哼,我有VBF
list2 = list1.FindAll(Which.Is >= 50 And Not Which.Is = 60)

你设想的AssertThat我也可以用VBF完美实现出来
c.AssertThat(a, 10, Greater(Of Integer))
c.AssertThat(m, Not EqualTo(27) And LessThan(50))

#4楼    回复  引用  查看    

2005-08-03 12:59 by Ninputer      
只是.NET的函数指针还差点劲,不支持C++的“成员指针”概念,也不支持对泛型类型参数的变量使用运算符,不然你帖子中所有的用法,我都照样可以用VBF写出。只可惜VB语法的抽象特性还差那么一点点。。

#5楼    回复  引用  查看    

2005-08-19 18:42 by Ninputer      
终于实现了方法调用,过两天发Post介绍
employees.each do |e|
e.doSomething
end

[C#]
employees.ForEach(delegate(Employee e) { e.DoSomething(); });


[VBF]
employees.ForEach(MemberCallN(Of Employee)(AddressOf Dummy(Of Employee).DoSomething))


后面用到属性的还没法实现……努力中

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-09-08 00:54 编辑过
成果网帮您增加网站收入


相关链接: