C#List<T> 投影转换(Select)作用 + 详解 + 示例

一、什么是投影转换

投影 是 LINQ 里的核心概念,对应方法就是 Select()
简单说:把集合里的每一个元素,加工、转换、提取成新数据,最终生成一个全新集合

List 本身只是存原始对象/值,投影就是“数据重塑”:提取字段、类型转换、拼接数据、生成新实体。


二、核心作用

  1. 只提取需要的字段(过滤冗余字段,减少数据传输/内存占用)
  2. 类型转换(对象 → 字符串、数值、其他实体)
  3. 数据加工计算(拼接、运算、格式化)
  4. 结构重组(旧实体 → 新实体、匿名类)

区别于筛选(Where删元素):

  • Where:过滤元素个数
  • Select:改变元素内容/类型

三、分类示例(C#7.3 可直接运行)

准备基础实体与测试数据:

using System;
using System.Collections.Generic;
using System.Linq;

// 原始实体
public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public decimal Score { get; set; }
}

class Program
{
    static void Main()
    {
        List<Student> stuList = new List<Student>
        {
            new Student{Id=1,Name="张三",Age=18,Score=90},
            new Student{Id=2,Name="李四",Age=19,Score=85},
            new Student{Id=3,Name="王五",Age=18,Score=96}
        };

        // 下面依次演示各类投影用法
        Console.ReadLine();
    }
}

1. 提取单个字段(最常用)

只拿出姓名,把 List<Student> 转为 List<string>

// 投影:只取 Name
List<string> nameList = stuList.Select(s => s.Name).ToList();
Console.WriteLine(string.Join("、", nameList));
// 输出:张三、李四、王五

2. 提取多个字段 → 匿名类

不想定义新实体,临时组合多个字段:

var tempList = stuList.Select(s => new
{
    编号 = s.Id,
    姓名 = s.Name,
    分数 = s.Score
}).ToList();

foreach (var item in tempList)
{
    Console.WriteLine($"编号:{item.编号} 姓名:{item.姓名}");
}

3. 数据计算/加工

对原有字段做运算、拼接、格式化:

// 拼接字符串 + 分数换算
var infoList = stuList.Select(s => 
    $"姓名:{s.Name},总分折合:{s.Score * 1.1m:F1}"
).ToList();

foreach (var info in infoList)
{
    Console.WriteLine(info);
}

4. 转换为全新实体

业务分层常用:数据库实体 → 页面展示实体(VO/DTO)

// 定义展示实体
public class StudentDto
{
    public int StuId { get; set; }
    public string StuName { get; set; }
}

// 投影转换为 DTO
List<StudentDto> dtoList = stuList.Select(s => new StudentDto
{
    StuId = s.Id,
    StuName = s.Name
}).ToList();

5. 结合 Where 先筛选、再投影(组合用法)

先过滤元素,再转换数据:

// 先筛选分数>88,再只取姓名
var highScoreNames = stuList
    .Where(s => s.Score > 88)
    .Select(s => s.Name)
    .ToList();

Console.WriteLine(string.Join(" ", highScoreNames));
// 输出:张三 王五

四、关键特点总结

  1. 不修改原集合
    投影会生成新集合,原 stuList 数据完全不变。
  2. 改变元素类型/结构
    可以 对象 → 字符串/数值/新对象/匿名类
  3. 延迟执行(LINQ 特性)
    Select 返回 IEnumerable<T>调用 ToList()/ToArray() 才真正执行遍历
  4. 性能场景
    大数据场景下,投影只取必要字段,大幅节省内存,比全对象传递更高效。

五、一句话总结

投影 Select = 对集合中每一项做“改造、提取、转类型”,产出新集合,是数据封装、视图展示、实体转换中最常用的 LINQ 操作。

posted @ 2026-05-26 15:02  人生就是修炼  阅读(12)  评论(0)    收藏  举报