Linq 学习(5) 集合操作

 本篇介绍Linq的集合操作。

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的延迟执行也会变为立即执行,后面介绍性能优化时会讨论。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值