C# Academy · 课时

SELECT 与投影

将数据塑造成新的形式

第 2 / 4 课13 个步骤

SELECT 与投影 是 CoddyKit 上的免费 C# Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

投影的含义

Select 会将序列中的每个元素转换为新的形状,这称为投影。

它接受一个 lambda,将单个元素映射为一个结果,并返回由这些结果组成的序列,同时保持源序列不变。

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4 };
var squares = nums.Select(n => n * n);
Console.WriteLine(string.Join(", ", squares));

改变类型

投影甚至可以完全改变元素类型。将 int 映射为 string 会生成一个 IEnumerable<string>。

输出类型会根据 lambda 的返回类型推断出来,因此编译器会替您跟踪它。

using System;
using System.Linq;

int[] nums = { 10, 20, 30 };
var labels = nums.Select(n => $"Item #{n}");
foreach (var l in labels) Console.WriteLine(l);

投影属性

一种常见用法是从对象中取出单个属性。Select(p => p.Name) 会将对象列表转换为名称列表。

在进一步处理或显示之前,这可以将数据缩减为您真正需要的部分。

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

record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var names = users.Select(u => u.Name);
Console.WriteLine(string.Join(", ", names));

匿名类型结果

您可以投影为匿名类型,以便将多个字段保存在一起。在 lambda 中使用 new { ... }。

编译器会即时生成一个带有只读属性的类,非常适合塑造中间结果。

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

record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var shaped = users.Select(u => new { u.Name, IsAdult = u.Age >= 18 });
foreach (var s in shaped) Console.WriteLine($"{s.Name}:{s.IsAdult}");

带索引的 Select

和 Where 一样,Select 也有一个公开零基索引的重载。lambda 接受 (element, index)。

这非常适合为项目编号,或将每个值与其位置配对。

using System;
using System.Linq;

string[] tasks = { "Wake", "Eat", "Code" };
var numbered = tasks.Select((t, i) => $"{i + 1}. {t}");
foreach (var n in numbered) Console.WriteLine(n);

查询语法中的 Select

在查询语法中,select 子句负责投影。您可以选择元素本身,也可以选择基于该元素的任意表达式。

将它与 where 结合,即可在一个易读的查询中同时完成筛选和塑形。

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5 };
var result = from n in nums
             where n % 2 == 1
             select n * 10;
Console.WriteLine(string.Join(", ", result));

SelectMany 扁平化

当每个元素都映射到一个集合时,Select 会得到一个由多个序列组成的序列。SelectMany 会将它们扁平化为一个序列。

它相当于 LINQ 中使用嵌套循环并连接内部结果。

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

var groups = new List<int[]> { new[] {1, 2}, new[] {3, 4} };
var flat = groups.SelectMany(g => g);
Console.WriteLine(string.Join(", ", flat));

投影同样采用延迟执行

Select 也采用延迟执行模型。只有在枚举序列时,映射 lambda 才会运行。

因此,构建投影的开销很小;真正的工作会在遍历或物化结果时发生。

using System;
using System.Linq;

int runs = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Select(n => { runs++; return n; });
Console.WriteLine($"Before: {runs}");
foreach (var _ in q) { }
Console.WriteLine($"After: {runs}");

先筛选再投影

为了清晰和高效,顺序很重要:先使用 Where 进行筛选,再使用 Select 进行投影,这样只需转换最终保留的元素。

这个处理流水线从上到下阅读起来很自然,也避免了不必要的投影工作。

using System;
using System.Linq;

int[] nums = { 1, 2, 3, 4, 5, 6 };
var result = nums.Where(n => n % 2 == 0)
                 .Select(n => n * n);
Console.WriteLine(string.Join(", ", result));

投影为新的记录类型

除了匿名类型,您还可以投影为命名类型或 record。当结果需要跨越方法边界时,这种方式很有用,因为匿名类型无法以已知名称返回。

这也是从更丰富的领域对象构建数据传输对象的方式。

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

record User(string Name, int Age);
record Summary(string Name);
var users = new List<User> { new("Ana", 30) };
var dtos = users.Select(u => new Summary(u.Name));
foreach (var d in dtos) Console.WriteLine(d.Name);

Select 保持顺序和数量

与 Where 不同,Select 不会添加或删除元素,而是一对一地进行映射。输出与输入具有相同的数量和顺序。

如果需要更少的项目,请进行筛选;如果需要从每个元素中得到更多内容,请使用 SelectMany。

using System;
using System.Linq;

int[] nums = { 5, 1, 9 };
var doubled = nums.Select(n => n * 2);
Console.WriteLine($"In:{nums.Length} Out:{doubled.Count()}");

快速检查

为任务选择正确的运算符。

回顾

Select 会将每个元素投影为新的形状——属性、字符串、匿名类型或记录类型——并以一对一的方式保持数量和顺序。它提供带索引的重载,并采用延迟执行。

SelectMany 会扁平化嵌套序列。接下来,我们将对已经塑形的数据进行排序和分组。

免费开始

用 AI 导师学习 C# — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
93
课程
346

常见问题解答

「SELECT 与投影」课时是免费的吗?

是的 — 「SELECT 与投影」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「SELECT 与投影」这节课中我会学到什么?

将数据塑造成新的形式 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「SELECT 与投影」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. WHERE 与筛选
  2. SELECT 与投影
  3. OrderBy 与分组
  4. 聚合与 ToList
← 返回 C# Academy