List<T> 投影转换(Select)作用 + 详解 + 示例
List 投影转换(Select)作用 + 详解 + 示例
一、什么是投影转换
投影是 LINQ 里的核心概念,对应方法就是Select()。
简单说:把集合里的每一个元素,加工、转换、提取成新数据,最终生成一个全新集合。
List 本身只是存原始对象/值,投影就是“数据重塑”:提取字段、类型转换、拼接数据、生成新实体。
二、核心作用
- 只提取需要的字段(过滤冗余字段,减少数据传输/内存占用)
- 类型转换(对象 → 字符串、数值、其他实体)
- 数据加工计算(拼接、运算、格式化)
- 结构重组(旧实体 → 新实体、匿名类)
区别于筛选(
Where是删元素):
Where:过滤元素个数Select:改变元素内容/类型
三、分类示例(C#7.3 可直接运行)
准备基础实体与测试数据:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;// 原始实体publicclassStudent{publicintId{get;set;}publicstringName{get;set;}publicintAge{get;set;}publicdecimalScore{get;set;}}classProgram{staticvoidMain(){List<Student>stuList=newList<Student>{newStudent{Id=1,Name="张三",Age=18,Score=90},newStudent{Id=2,Name="李四",Age=19,Score=85},newStudent{Id=3,Name="王五",Age=18,Score=96}};// 下面依次演示各类投影用法Console.ReadLine();}}1. 提取单个字段(最常用)
只拿出姓名,把List<Student>转为List<string>:
// 投影:只取 NameList<string>nameList=stuList.Select(s=>s.Name).ToList();Console.WriteLine(string.Join("、",nameList));// 输出:张三、李四、王五2. 提取多个字段 → 匿名类
不想定义新实体,临时组合多个字段:
vartempList=stuList.Select(s=>new{编号=s.Id,姓名=s.Name,分数=s.Score}).ToList();foreach(varitemintempList){Console.WriteLine($"编号:{item.编号}姓名:{item.姓名}");}3. 数据计算/加工
对原有字段做运算、拼接、格式化:
// 拼接字符串 + 分数换算varinfoList=stuList.Select(s=>$"姓名:{s.Name},总分折合:{s.Score*1.1m:F1}").ToList();foreach(varinfoininfoList){Console.WriteLine(info);}4. 转换为全新实体
业务分层常用:数据库实体 → 页面展示实体(VO/DTO)
// 定义展示实体publicclassStudentDto{publicintStuId{get;set;}publicstringStuName{get;set;}}// 投影转换为 DTOList<StudentDto>dtoList=stuList.Select(s=>newStudentDto{StuId=s.Id,StuName=s.Name}).ToList();5. 结合 Where 先筛选、再投影(组合用法)
先过滤元素,再转换数据:
// 先筛选分数>88,再只取姓名varhighScoreNames=stuList.Where(s=>s.Score>88).Select(s=>s.Name).ToList();Console.WriteLine(string.Join(" ",highScoreNames));// 输出:张三 王五四、关键特点总结
- 不修改原集合
投影会生成新集合,原stuList数据完全不变。 - 改变元素类型/结构
可以对象 → 字符串/数值/新对象/匿名类。 - 延迟执行(LINQ 特性)
Select返回IEnumerable<T>,调用 ToList()/ToArray() 才真正执行遍历。 - 性能场景
大数据场景下,投影只取必要字段,大幅节省内存,比全对象传递更高效。
五、一句话总结
投影 Select = 对集合中每一项做“改造、提取、转类型”,产出新集合,是数据封装、视图展示、实体转换中最常用的 LINQ 操作。
