扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
来源:ZOL下载频道 2010年8月9日
关键字: Visual Basic 软件
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;
这儿的问题是GetProcesses()被调用了两次。也就是说操作系统必须查询两次,在结果集合中执行两次循环。一个更快的方法也许是对GetProcesses()的调用进行缓存。
varprocesses=(frompinProcess.GetProcesses()selectnew).ToList();
vartotals2=new;
虽然好了一些,但仍然需要两次循环。如何只执行一次呢?这时我们需要一个定制的聚合器,和一个保存这些结果的命名类(NamedClass)。
publicstaticProcessTotalsSum(thisIEnumerablesource)
returntotals;
}
publicclassProcessTotals
publiclongWorkingSet64
}
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);
vartotals4=processes.Aggregate(newProcessTotals(),(sum,p)=>);
注意在这儿,ProcessTotals类依然需要用到。匿名类不能被用在这儿,因为C#匿名类是不可变的。虽然VisualBasic的匿名类可以改变,但是在这儿也没用,因为VB不能创建多行的匿名函数。
但是VisualBasic和C#都较从前有了强有力的改进,双方也各有长处,让对方在不足之处加油赶上。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者