快速业务通道

LINQ学习笔记:聚合方法

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-14

Sum与Average

源序列: IEnumerable

可选的结果选择器: TSource => TResult

Sum和Average这两个聚合操作符使用与Min和Max类似:

   1: decimal[] numbers = { 3, 4, 8 };
   2:  
   3: decimal sumTotal  = numbers.Sum();       // 15
   4:  
   5:  average   = numbers.Average();   // 5

 

以下查询返回names数组中每一个元素的长度总和:

   1: int combinedLength = names.Sum (s =>s.Length);

 

Sum和Average操作必需是关于数值类型(int, long, float, double以及nullable版本), 相反的, Min和Max就没有这么严格的限定, 它们可以操作那些实现了Icomparable的元素, 例如string. 此外, Average总是返回decimal或者double两者之一:

1.如果选择器类型是decimal,则返回类型也是decimal

2.如果选择器类型是int, long, float, double, 则返回类型是double

这意味着下面的查询无法编译(因为double不能为自动转换为int)

   1: int avg = new int[] { 3, 4 }.Average();

 

但是以下的查询则没有问题:

   1: double avg = new int[] { 3, 4}.Average();   // 3.5

 

Average隐式提高输入值的精度以避免原有精度丢失. 这这个例子中, 我们取得平均值3.5, 而不需要去诉求于一个输入元素的转换:

   1: double avg = numbers.Average (n =>(double) n);

 

在LINQ to SQL中, Sum和Average被翻译成了标准的SQL聚合函数, 以下的查询返回了那些包含有订单平均值 > 500的客户名称:

   1: from c in dataContext.Customers
   2:  
   3: where c.Purchases.Average (p => p.Price) > 500
   4:  
   5: select c.Name;

 

聚合

Aggregate允许你嵌入一个自定义的算法来实现那些不是很常用的聚合场景. Aggregations在LINQ to SQL当中不受支持. 以下的查询演示了如果使用Aggregate来做与Sum的工作:

   1: int[] numbers = { 1, 2, 3 };
   2: int sum = numbers.Aggregate (0, (seed, n)=> seed + n);

 

  第一个参数是seed,表示从那个元素位置开始计算. 第二个参数是一个更新计算结果值的表达式, 并作为一个新的元素继续循环下去. 我们还可以使用可选的第三个参数在返回值的时候再作进一步的project. 待续!

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号