知识大全 Visual Basic和C#中的LINQ聚合

Posted 函数

篇首语:骏马是跑出来的,强兵是打出来的。。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Visual Basic和C#中的LINQ聚合相关的知识,希望对你有一定的参考价值。

Visual Basic和C#中的LINQ聚合  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

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

  var totalVirtualMemory = (from p in Process GetProcesses()

  select p VirtualMemorySize ) Sum();

  Dim totalVirtualMemory = _

  (From p In Process GetProcesses _

  Select p VirtualMemorySize ) Sum

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

  Dim totalVirtualMemory = Aggregate p In Process GetProcesses _ Into p VirtualMemorySize

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

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

  var totals = new

  totalVirtualMemory = (from p in Process GetProcesses() select p VirtualMemorySize ) Sum()

  totalWorkingSet = (from p in Process GetProcesses() select p WorkingSet ) Sum() ;

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

  var processes = (from p in Process GetProcesses() select new p VirtualMemorySize p WorkingSet ) ToList();

  var totals = new totalVirtualMemory = (from p in processes select p VirtualMemorySize ) Sum()

  totalWorkingSet = (from p in processes select p WorkingSet ) Sum()

  ;

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

  public static ProcessTotals Sum(this IEnumerable source)

  var totals = new ProcessTotals();

  foreach (var p in source)

  totals VirtualMemorySize += p VirtualMemorySize ;

  totals WorkingSet += p WorkingSet ;

  

  return totals;

  

  public class ProcessTotals

  public long VirtualMemorySize get; set;

  public long WorkingSet get; set;

  

  var totals = (from p in Process GetProcesses() select p) Sum();

  开发者在Visual Basic中也可以这样做 但需要像下面这样做

  Dim totals = Aggregate p In Process GetProcesses _

  Into virtualMemory = Sum(p VirtualMemorySize ) _

  workingSet = Sum(p WorkingSet )

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

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

  var processes = (from p in Process GetProcesses() select new p VirtualMemorySize p WorkingSet );

  var totals = processes Aggregate(new ProcessTotals() (sum p) => sum WorkingSet += p WorkingSet ;

  sum VirtualMemorySize += p VirtualMemorySize ; return sum;

  );

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

cha138/Article/program/net/201311/12062

相关参考

知识大全 Visual C#或Visual Basic创建Web应用程序(下)

VisualC#或VisualBasic创建Web应用程序(下)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起

知识大全 从Visual Basic 6.0到Visual Basic.NET

从VisualBasic6.0到VisualBasic.NET  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 Visual Basic.NET和GDI+共创图标编辑器

VisualBasic.NET和GDI+共创图标编辑器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 实战Visual Basic.Net对话框

实战VisualBasic.Net对话框  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对话框和

知识大全 Visual Basic的座标系统

VisualBasic的座标系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这里我们来看一下

知识大全 Visual Basic.Net基本语句

VisualBasic.Net基本语句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一Try…

知识大全 Visual Basic.Net实现TCP协议

VisualBasic.Net实现TCP协议  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!TCP协

知识大全 Visual C#中的数据绑定操作

VisualC#中的数据绑定操作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   Vi

知识大全 使用Visual Basic.NET重载事件处理程序

使用VisualBasic.NET重载事件处理程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Visual Basic.NET中组件的叠加使用

VisualBasic.NET中组件的叠加使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  状