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

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

投影

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

下面示例代码的数据源:


一、投影成原对象

投影成原对象是从原集合中筛选出满足条件的元素,形成一个新的集合。通过C#版本1和版本2的演示,可以轻松地从用户列表中筛选职业为医生的用户,并生成包含医生信息的新集合。

示例代码如下:

/* C#版本1 */List<User>userList= (fromuinlistwhereu.occupation=="Doctor"selectu).ToList();
/* C#版本2 */List<User>userList=list.Where(p=>p.occupation=="Doctor").ToList();
/* 投影后集合 */[{id=11, name=ZhangSan, age=21, gender=False, occupation=Doctor}, 
{id=7, name=LiSi, age=21, gender=True, occupation=Doctor}, 
{id=2, name=WangWu, age=18, gender=False, occupation=Doctor}]

二、投影成基本类型

在这种投影中,只选择原集合中的特定属性(例如姓名)作为新集合的元素。这样,新集合将只包含基本类型(如字符串)的元素,而不是完整的用户对象。这种筛选和投影方式可以更灵活地处理特定属性。

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

示例代码如下:

/* C#版本1 */List<string>nameList= (fromuinlistwhereu.occupation=="Doctor"selectu.name).ToList();
/* C#版本2 */List<string>nameList=list.Where(p=>p.occupation=="Doctor").Select(x=>x.name).ToList();
/* 投影后集合 */["Zhang San", "Li Si", "Wang Wu"]

三、投影成元组

投影成元组的过程中,从原集合中选择多个属性,将它们组成一个元组,并生成一个新的元组集合。通过C#版本1和版本2的演示,我们可以得到一个包含用户姓名和年龄的元组集合,方便处理相关信息。

示例代码如下:

/* C#版本1 */varuserList= (fromuinlistwhereu.occupation=="Doctor"select ( Name: u.name, Age: u.age )).ToList();
/* C#版本2 */varuserList=list.Where(x=>x.occupation=="Doctor").Select(u=> (Name: u.name, Age: u.age)).ToList();
/* 投影后集合 */[("Zhang San", 21), ("Li Si", 21), ("Wang Wu", 18)]

四、投影成匿名对象

匿名对象投影是通过选择原集合中的特定属性,构建一个匿名对象的新集合。这样的投影可以在不定义新的数据类型的情况下,直接生成包含所需属性的对象集合。在示例中,我们得到了一个包含用户姓名和年龄的匿名对象集合。

示例代码如下:

/* C#版本1 */varuserList= (fromuinlistwhereu.occupation=="Doctor"selectnew { u.name, u.age }).ToList();
/* C#版本2 */varuserList=list.Where(x=>x.occupation=="Doctor").Select(u=>new { u.name, u.age }).ToList();
/* 投影后集合 */[{"Zhang San", 21}, {"Li Si", 21}, {"Wang Wu", 18}]

这四种投影方式使得对原始数据集进行更灵活的处理和筛选成为可能,提高了代码的可读性和维护性。

目录
相关文章
|
4月前
|
开发框架 .NET 编译器
C# 10.0中Lambda表达式的改进:更简洁、更灵活的代码编写体验
【1月更文挑战第21天】随着C#语言的不断发展,Lambda表达式作为一种简洁、高效的函数式编程工具,在C# 10.0中迎来了重要的改进。本文将详细探讨C# 10.0中Lambda表达式的新特性,包括参数类型的推断增强、自然类型的Lambda参数以及Lambda表达式的属性改进等。这些改进不仅简化了Lambda表达式的编写过程,还提升了代码的可读性和灵活性,为开发者带来了更优质的编程体验。
|
4月前
|
SQL 开发框架 .NET
C#进阶-LINQ实现对集合的增删改查
本篇演示了LINQ在日常开发中的常用操作,实现结果集的增删改查。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
38 0
|
2月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---where和select用法(二)
C#学习相关系列之Linq用法---where和select用法(二)
|
2月前
|
开发框架 .NET C#
C#学习相关系列之Linq用法---group和join相关用法(三)
C#学习相关系列之Linq用法---group和join相关用法(三)
|
2月前
|
开发框架 .NET C#
C#学习相关系列之Linq常用方法---排序(一)
C#学习相关系列之Linq常用方法---排序(一)
|
2月前
|
开发框架 .NET 编译器
C#学习相关系列之匿名方法和Lambda表达式
C#学习相关系列之匿名方法和Lambda表达式
|
2月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
159 2
|
3月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
10 0
|
4月前
|
开发框架 .NET 编译器
C# 9.0中的目标类型新表达式:类型推断的又一进步
【1月更文挑战第16天】C# 9.0引入了目标类型新表达式,这是类型推断功能的一个重要扩展。通过目标类型新表达式,开发者在创建对象时可以省略类型名称,编译器会根据上下文自动推断所需类型。这一特性不仅简化了代码编写,还提高了代码的可读性和维护性。本文将详细介绍目标类型新表达式的语法、使用场景及其对C#编程的影响。
|
4月前
|
机器学习/深度学习 开发框架 .NET
C# 中的 Lambda 表达式:一种简洁而强大的编程工具
【1月更文挑战第6天】在现代编程中,Lambda 表达式已经成为一种非常流行的编程范式。C# 作为一种功能强大的、面向对象的编程语言,自然也不例外。Lambda 表达式在 C# 中提供了一种简洁、灵活的方式来表示匿名函数。这些函数可以被用作委托或表达式树类型,从而在各种不同的上下文中使用。