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 6.0精简版
- 本软件在编程工具中排名第5位
- 用户评分:9.1 | 有 44 人点评
- 更新时间:2012年01月18日
- 开发商:微软
- 下载次数:2446419次
- 应用平台:Win XP/Win2000/Win98/Win ME
- 软件分类:编程工具
- 论坛讨论:进入论坛
- 相关阅读:
- ·Sailfish OS转机 公司Jolla完成C轮融资
//soft.zol.com.cn/558/5588893.html - ·Visual Studio 2015 Update 1正式发布
//soft.zol.com.cn/555/5550606.html - ·逆思维!阿里钉钉推开放平台用C++战略
//soft.zol.com.cn/537/5379077.html - ·越狱黑客i0n1c称iOS8完美越狱很容易
//soft.zol.com.cn/458/4588460.html - ·黑客i0n1c放出iOS7.1.1完美越狱照片
//soft.zol.com.cn/454/4547875.html

