Linq 学习(4) 投影、筛选和排序
2008-11-29 15:28
351 查看
这里简单介绍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>)>) 并将结果序列合并为一个序列。
Distinct
原型为:
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source)
去掉投影结果集的重复元素。该运算只能以方法调用的方式进行操作。
上面同样的场景:查询组成学生姓名的所有字符的不重复序列。
var result = DataSource.Students.SelectMany(str => str.Name).Distinct();
First、Last、Skip、Take、Single
First 选择集和的第一个元素。
var result = DataSource.Students.Select(student => student).First(); // Student ID:1,Student Name:Andy
Last 选择集和的最后一个元素。
var result = DataSource.Students.Select(student => student).Last(); // Student ID:4,Student Name:Dark
Skip 跳过N个元素。
var result = DataSource.Students.Select(student => student).Skip(2).Count(); // 2
Take 选择集合的前N个元素。
var result = DataSource.Students.Select(student => student).Skip(2).Take(1).Count(); // 1
Single 返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。
var result = DataSource.Students.Select(student => student).Single(); // 异常:Sequence contains more than one element
OrderBy[Descending]
对集合进行排序。
public static IOrderedEnumerable<TSource> OrderBy[Descending]<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector[, IComparer<TKey> comparer])
TKey必须已经实现了IComparer<T>接口。
var result = from student in DataSource.Students
orderby student.Name descending
select student.Name;
// 等价于:
var result = DataSource.Students.OrderByDescending(student => student.Name).Select(student => student.Name);
// 结果:
// Dark
// Cindy
// Bill
// Andy
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>)>) 并将结果序列合并为一个序列。
Distinct
原型为:
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source)
去掉投影结果集的重复元素。该运算只能以方法调用的方式进行操作。
上面同样的场景:查询组成学生姓名的所有字符的不重复序列。
var result = DataSource.Students.SelectMany(str => str.Name).Distinct();
First、Last、Skip、Take、Single
First 选择集和的第一个元素。
var result = DataSource.Students.Select(student => student).First(); // Student ID:1,Student Name:Andy
Last 选择集和的最后一个元素。
var result = DataSource.Students.Select(student => student).Last(); // Student ID:4,Student Name:Dark
Skip 跳过N个元素。
var result = DataSource.Students.Select(student => student).Skip(2).Count(); // 2
Take 选择集合的前N个元素。
var result = DataSource.Students.Select(student => student).Skip(2).Take(1).Count(); // 1
Single 返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。
var result = DataSource.Students.Select(student => student).Single(); // 异常:Sequence contains more than one element
OrderBy[Descending]
对集合进行排序。
public static IOrderedEnumerable<TSource> OrderBy[Descending]<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector[, IComparer<TKey> comparer])
TKey必须已经实现了IComparer<T>接口。
var result = from student in DataSource.Students
orderby student.Name descending
select student.Name;
// 等价于:
var result = DataSource.Students.OrderByDescending(student => student.Name).Select(student => student.Name);
// 结果:
// Dark
// Cindy
// Bill
// Andy
相关文章推荐
- C#中的Linq 学习 投影、筛选和排序
- Linq 学习(4) 投影、筛选和排序
- Linq学习笔记--延迟操作符(排序操作符)
- VS.2010.C#.LINQ 学习(三)-not in、排序、分页
- Linq学习总结(6)——排序
- [转]WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组
- 练习LINQ:同时操作二维和一维数组,把二维数组转为一维,计算一维和二维值,字符串组合,计算数组和,数组筛选,排序
- linq动态排序学习
- C#使用linq对数组进行筛选排序的方法
- MVC5 Entity Framework学习参加排序、筛选和排序功能
- Linq学习——gridview实现双向排序
- Lambda表达式和Linq实现数据集的简单筛选并排序
- 按任意词或字段对文本数据进行排序或筛选 (LINQ)
- MongDB基础学习(五)——投影,分页,排序,聚合
- 不使用遍历循环、Linq与Lamba表达式快速对List集合进行筛选与排序——在集合类里使用Find、FindAll与Sort
- MVC3学习第十一章 葵花点穴手之隔空点穴----MVC3下利用EF和LINQ进行简单的多表联查、排序以及在Razor视图中调用自定义类
- LINQ 学习笔记-字符串数组与整数数组之间的转换,排序
- MongDB基础学习(五)——投影,分页,排序,聚合
- WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组
- WPF and Silverlight 学习笔记(二十五):使用CollectionView实现对绑定数据的排序、筛选、分组