当前位置:主页   - 电脑 - 程序设计 - C#
Linq 学习(5) 集合操作
来源:网络   作者:   更新时间:2012-08-04
收藏此页】    【字号    】    【打印】    【关闭

  本篇介绍Linq的集合操作,继续使用《Linq 学习(3) 语法结构》中介绍的数据源。

  Count/LongCount

  Count/LongCount 返回结果集中元素的数量,返回类型分别为int/long。

  原型为:

public static int Count<TSource>(this IEnumerable<TSource> source[, Func<TSource, bool> predicate])

  姓名长度大于四个字符的学生的数量:

var result = (from student in DataSource.Students
       select student).Count(stu => { return stu.Name.Length > 4; }); // result: 1
  
Sum/Min/Max/Average

  分别返回结果集元素或其属性的和、最小值、最大值、平均值。

  Sum:返回集合元素的和,参与计算的集合元素必须为基本的值类型或可空类型。

  计算总分:

  var result = (from score in DataSource.Scores

  select score).Sum(score => { return score.Value; });

  Min/Max:结果集元素的最大值或最小值,要求集合元素实现IComparable<T> 或 IComparable接口。

  选择最高成绩:

var result = (from score in DataSource.Scores
       select score).Max(score => { return score.Value; }); // result: 96

  Average:返回集合元素的平均值,参与计算的集合元素必须为基本的值类型或可空类型。

  计算平均成绩:

var result = (from score in DataSource.Scores
       select score).Average(score => { return score.Value; }).ToString("F2"); // result: 75.23

  Union

  联合两个拥有相同或相似元素的集合,不去掉重复元素。

  Union原型为:

public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
  
var result = DataSource.Students.Union(DataSource.Students2);

  // result: 两个集合的所有元素的集合。

  Aggregate

  Aggregate是最灵活的操作符,有些前面Sum/Min/Max/Average不支持的类型可以自己定义其实现。

  Aggregate原型为:

public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector)

  source

  要聚合的 IEnumerable<(Of <(T>)>)。

  seed

  累加器的初始值。

  func

  要对每个元素调用的累加器函数。

  resultSelector

  将累加器的最终值转换为结果值的函数。

  返回所有学生的姓名字符串(相当于自定义Sum):

var result = (from student in DataSource.Students
       select student.Name)
       .Aggregate("Name:", (a, b) => a + " " + b, c => c + " n");
// result: Name: Andy Bill Cindy Dark

  选择的学生姓名(按字符串排序取最大的,相当于实现Max):

var result = (from student in DataSource.Students
       select student.Name).Aggregate((a, b) => string.Compare(a, b) > 0 ? a : b);
// result: Dark

  算分数的平均值(返回Score对象,相当于自定义Average):

var collection = from score in DataSource.Scores
       select score;
var result = collection.Aggregate(new Score { Value = 0 },
  (a, b) => { return new Score { Value = a.Value + b.Value }; },
  c => new Score { Value = c.Value / collection.Count() }).Value.ToString("F2");
// result: 75.23

  Aggregate 可以灵活的实现各种自定义的功能。

  集合操作会影响Linq的执行效率,因为执行集合操作时会遍历甚至多次遍历集合元素;对Linq的延迟执行也会变为立即执行,后面介绍性能优化时会讨论。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明