C#进阶-LINQ表达式之投影

2024-02-03 10:34:00 浏览数 (3)

本篇文章我们将演示LINQ扩展包语法里的投影特性,用投影实现LINQ结果集的类型转换。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。

投影

投影的过程就是把取得的结果进行处理,可以把结果集合内的对象只取其中一个或多个元素组成一个新的集合,生成一个原对象、基本类型、元组或匿名对象的新集合。

① 投影成原对象

代码语言:javascript复制
/* C#版本1 */
List<User> userList = (from u in list where u.occupation == "Doctor" select u).ToList();
/* C#版本2 */
List<User> userList = list.Where(p => p.occupation == "Doctor").ToList();
代码语言:javascript复制
/* 投影后集合 */
[{id = 11, name = Zhang San, age = 21, gender = False, occupation = Doctor}, 
{id = 7, name = Li Si, age = 21, gender = True, occupation = Doctor}, 
{id = 2, name = Wang Wu, age = 18, gender = False, occupation = Doctor}]

② 投影成基本类型

这里是把原有的User集合中每个User的name属性提取出来,组成一个全是name的新的集合,故新集合为String属性。

代码语言:javascript复制
/* C#版本1 */
List<string> nameList = (from u in list where u.occupation == "Doctor" select u.name).ToList();
/* C#版本2 */
List<string> nameList = list.Where(p => p.occupation == "Doctor").Select(x => x.name).ToList();
代码语言:javascript复制
/* 投影后集合 */
["Zhang San", "Li Si", "Wang Wu"]

③ 投影成元组

代码语言:javascript复制
/* C#版本1 */
var userList = (from u in list where u.occupation == "Doctor" select ( Name: u.name, Age: u.age )).ToList();
/* C#版本2 */
var userList = list.Where(x => x.occupation == "Doctor").Select(u => (Name: u.name, Age: u.age)).ToList();
代码语言:javascript复制
/* 投影后集合 */
[("Zhang San", 21), ("Li Si", 21), ("Wang Wu", 18)]

④ 投影成匿名对象

代码语言:javascript复制
/* C#版本1 */
var userList = (from u in list where u.occupation == "Doctor" select new { u.name, u.age }).ToList();
/* C#版本2 */
var userList = list.Where(x => x.occupation == "Doctor").Select(u => new { u.name, u.age }).ToList();
代码语言:javascript复制
/* 投影后集合 */
[{"Zhang San", 21}, {"Li Si", 21}, {"Wang Wu", 18}]

0 人点赞