Linq 学习(5) 集合操作
2008-11-29 15:44
316 查看
本篇介绍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的延迟执行也会变为立即执行,后面介绍性能优化时会讨论。
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的延迟执行也会变为立即执行,后面介绍性能优化时会讨论。
相关文章推荐
- Linq 学习(5) 集合操作
- (LINQ 学习系列)(7)Linq教程实例: LINQ多表关联操作
- python学习三之集合操作与函数操作
- (LINQ 学习系列)(5)Linq教程实例: 单表操作之增 删 改 查询
- JAVAWEB开发之redis学习(四)——Set集合相关的操作命令
- JAVAWEB开发之redis学习(六)——HashSet集合相关的操作命令
- Linq对DataTable或者集合的排序,Where筛选,分组,统计总数sum等操作
- pg学习_集合操作
- C# Xml Linq XDocument 基本操作 -- 重新学习
- LINQ相关的集合操作
- KotLin学习--集合过滤操作的惯用语法
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
- PHP学习手记之Mysql返回结果fetch操作集合
- Linq对DataTable或者集合的排序,Where筛选,分组,统计总数sum等操作
- 3.python的set集合的操作示例——《深入python》学习
- 学习第六天@Linq操作
- LINQ集合操作
- (LINQ 学习系列)(4)Linq教程实例: LINQ单表操作
- JAVAWEB开发之redis学习(五)——SortedSet集合相关的操作命令
- linq to sql 学习(7)linq的分组汇总操作