SELECT 与投影
将数据塑造成新的形式
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 反馈 — 无需本地设置。
此课程中的所有课时
- WHERE 与筛选
- SELECT 与投影
- OrderBy 与分组
- 聚合与 ToList