热点推荐
ZOL首页 > 软件资讯 > 技巧应用 > 常用软件 > Visual Basic和C#中的LINQ扩展式聚合

Visual Basic和C#中的LINQ扩展式聚合


华军资讯 【转载】 2010年08月09日 09:13 评论

  Aggregate是一个可以从一个数据集合中获取标量值的函数,比如T-SQL中的Min()、Max()和Sum()等。现在VB和C#也都对这种聚合的功能给于了支持,但是是以一种非常不同的方式。

  Visual Basic下载:Visual Basic 6.0 精简版

  VB和C#都是以扩展方法的形式支持聚合的。在一个IEnumberable对象中,一个简单的调用是通过点符号完成的,比如:

  vartotalVirtualMemory=(frompinProcess.GetProcesses()

  selectp.VirtualMemorySize64).Sum();

  DimtotalVirtualMemory=_

  (FrompInProcess.GetProcesses_

  Selectp.VirtualMemorySize64).Sum

  从这儿可以看到,VB和C#的版本几乎是一样的。但VB还为聚合专门提供了一个LINQ语法:

  DimtotalVirtualMemory=AggregatepInProcess.GetProcesses_Intop.VirtualMemorySize64

  如果这是二者之间唯一区别的话,那么也就没有什么好谈的了。但是,有趣的事情发生在当你想同时操作不止一个“列”的时候。简便起见,我们假设要操作正在使用的全部虚拟内存和全部工作集(物理内存)。

  使用匿名类,我们可以轻松地创建一个带有它们两个值的变量。

  vartotals=new{

  totalVirtualMemory=(frompinProcess.GetProcesses()selectp.VirtualMemorySize64).Sum(),

  totalWorkingSet=(frompinProcess.GetProcesses()selectp.WorkingSet64).Sum()};

  这儿的问题是GetProcesses()被调用了两次。也就是说操作系统必须查询两次,在结果集合中执行两次循环。一个更快的方法也许是对GetProcesses()的调用进行缓存。

  varprocesses=(frompinProcess.GetProcesses()selectnew{p.VirtualMemorySize64,p.WorkingSet64}).ToList();

  vartotals2=new{totalVirtualMemory=(frompinprocessesselectp.VirtualMemorySize64).Sum(),

  totalWorkingSet=(frompinprocessesselectp.WorkingSet64).Sum()

  };

  虽然好了一些,但仍然需要两次循环。如何只执行一次呢?这时我们需要一个定制的聚合器,和一个保存这些结果的命名类(NamedClass)。

  publicstaticProcessTotalsSum(thisIEnumerablesource){

  vartotals=newProcessTotals();

  foreach(varpinsource){

  totals.VirtualMemorySize64+=p.VirtualMemorySize64;

  totals.WorkingSet64+=p.WorkingSet64;

  }

  returntotals;

  }

  publicclassProcessTotals{

  publiclongVirtualMemorySize64{get;set;}

  publiclongWorkingSet64{get;set;}

  }

  vartotals3=(frompinProcess.GetProcesses()selectp).Sum();

  开发者在VisualBasic中也可以这样做,但需要像下面这样做:

  Dimtotals3=AggregatepInProcess.GetProcesses_

  IntovirtualMemory=Sum(p.VirtualMemorySize64),_

  workingSet=Sum(p.WorkingSet64)

  就像在上一个C#例子中,我们是用一个含有两个Field的变量解决问题的。但这和C#的例子不一样,你不会因为是选择创建自己的聚合函数及类还是在遍历集合中浪费两次循环,而左右为难。

  公平起见,C#确实还有那么几招。不像VB那样只支持单行的匿名函数,只要需要,C#可以让它们很复杂,这就使得它可以在需要的时候创建匿名的聚合函数。

  varprocesses=(frompinProcess.GetProcesses()selectnew{p.VirtualMemorySize64,p.WorkingSet64});

  vartotals4=processes.Aggregate(newProcessTotals(),(sum,p)=>{sum.WorkingSet64+=p.WorkingSet64;

  sum.VirtualMemorySize64+=p.VirtualMemorySize64;returnsum;

  });

  注意在这儿,ProcessTotals类依然需要用到。匿名类不能被用在这儿,因为C#匿名类是不可变的。虽然VisualBasic的匿名类可以改变,但是在这儿也没用,因为VB不能创建多行的匿名函数。

  但是VisualBasic和C#都较从前有了强有力的改进,双方也各有长处,让对方在不足之处加油赶上。

下载 Visual Basic 请点击://xiazai.zol.com.cn/detail/3/29939.shtml
查看更多软件信息>> Visual Basic 6.0精简版
本软件在编程工具中排名第5位
用户评分:9.1 | 有 44 人点评
更新时间:2012年01月18日
开发商:微软
下载次数:2446419次
应用平台:Win XP/Win2000/Win98/Win ME
软件分类:编程工具
论坛讨论:进入论坛
看完本文后的感受:文章感受排行>>
频道热词:微信  手机QQ  12306  
视觉焦点
Visual Basic 6.0精简版
  • 更新时间:2012年01月18日
  • 软件大小:6.008MB
  • 软件分类:编程工具
  • 语言种类:简体中文
  • 软件评级:有 44 人点评
QQ电脑管家6.0
新浪微博