Welcome

首页 / 软件开发 / C# / Linq学习(4) 投影、筛选和排序

Linq学习(4) 投影、筛选和排序2010-07-12 博客园 飘遥(周振兴)这里简单介绍Linq的投影、筛选和排序子句。

Select

select 在一个集合序列按给定的条件进行投影,select 可以返回组合的筛选结果,返回匿名类型,对返回结果进行操作,返回组合的子查询结果等等。

select 的方法定义原形为:

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)

该扩展方法是在Enumerable类型中定义的。

// 数据源的类型的属性

var result = from student in DataSource.Students
where student.Name.Length > 3
select student.Name;

// 数据源类型筛选后的结果

var result = from student in DataSource.Students
where student.Name.Length > 3
select student;

// 新类型

var result = from student in DataSource.Students
where student.Name.Length > 3
select new Student { Name = student.Name, StudentID = student.StudentID };

// 匿名类型

var result = from student in DataSource.Students
where student.Name.Length > 3
select new { Name = student.Name, StudentID = student.StudentID };

// 对返回结果进行操作

var result = from student in DataSource.Students
where student.Name.Length > 3
select student.ToString();

由Select方法原型可看出,返回结果为:IEnumerable<T>类型。

SelectMany

SelectMany定义原型为:

public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)

通过原型可以看出,筛选结果的每一个元素类型都应该实现IEnumerable<T>接口。

string实现了IEnumerable<T>接口,可以构造这样的场景:查询组成学生姓名的所有字符序列。

var result = DataSource.Students.SelectMany(str => str.Name);

等价的Select 子句为:

var result = from student in DataSource.Students
from ch in student.Name
select ch;

可以认为SelectMany是将序列的每个元素投影到 IEnumerable<(Of <(T>)>) 并将结果序列合并为一个序列。