游乐游手机版
首页/科技数码/文章详情

C#集合操作新语法:用展开运算符(..)简化代码实战

时间:2026-01-13 10:49
从 C 13 起(需配合 NET 9),语言新增了展开运算符( ),让集合操作变得像写自然语言一样直白:你想“把这几个东西放一起”,就真的能直接“放一起”。 在 C 中拼接数组、合并列表、复

自 C# 13 起(需配合 .NET 9),语言新增了展开运算符(..),它让集合操作变得像写自然语言一样直白:你想“把这几个东西放一起”,就真的能直接“放一起”。

在 C# 中拼接数组、合并列表、复制集合,过去常依赖 Array.Copy()、.Concat() 或 .AddRange()。这些方法固然可靠,但代码往往冗长、嵌套深、意图不直观——尤其当需要组合多个来源时,几行逻辑可能写出十几行样板代码。

好消息是,从C# 13 起(需配合 .NET 9),语言新增了展开运算符(..),它让集合操作变得像写自然语言一样直白:你想“把这几个东西放一起”,就真的能直接“放一起”。

展开运算符怎么用?看几个典型场景

最基本的用法是合并两个数组或列表:

int[] part1 = [1, 2, 3];
int[] part2 = [4, 5, 6];
int[] combined = [..part1, ..part2]; // 结果:[1, 2, 3, 4, 5, 6]

不需要 .Concat(),不用 ToArray(),一行搞定,结果还是强类型数组。

也可以混合单个元素和集合:

int[] extras = [10, 20];
int[] allItems = [0, ..extras, 30]; // [0, 10, 20, 30]

甚至支持不同类型的集合混用——只要元素类型兼容:

int[] arr = [1, 2];
List list = [3, 4];
Span span = stackalloc int[] { 5, 6 };
var result = [..arr, ..list, ..span]; // [1, 2, 3, 4, 5, 6]

实际项目中,它特别适合构建动态配置:

string[] basePaths = ["/api", "/health"];
string[] customPaths = GetCustomEndpoints();
string[] allPaths = ["/", ..basePaths, ..customPaths];

或组装 API 响应:

var commonHeaders = ["Cache-Control: no-store"];
var customHeaders = GetServiceHeaders();
var responseHeaders = [..commonHeaders, ..customHeaders, "X-Request-ID: abc123"];

创建集合副本也更简洁:

int[] original = [1, 2, 3];
int[] copy = [..original]; // 等同于 original.ToArray(),但更短

为什么推荐它?

可读性高:[a, ..rest, b] 直观表达“开头是 a,中间是 rest 全部,结尾是 b”,意图一目了然。

减少样板代码:告别 new List { .. } 加上多次 .Add() 最后再 .ToArray() 的冗长链条。

类型安全:编译时检查元素类型,避免运行时类型不匹配。

性能合理:内部优化为单次内存分配,比链式 .Concat() 更高效(尤其多段拼接时)。

兼容性强:支持任何 IEnumerable,包括数组、列表、Span、自定义集合。

使用时要注意什么?

展开运算符创建的是浅拷贝——和 ToList()、ToArray() 行为一致,对引用类型元素,副本与原集合共享对象实例。

它不适用于需要转换或过滤的场景。例如,若想把所有 ID 加 100 后合并,仍需用 LINQ:

// ✅ 正确:需要转换时用 Select
var shifted = [..part1.Select(x => x + 100), ..part2];
// ❌ 低效:用 Spread 再手动改,反而更啰嗦

另外,目前仅支持 C# 13 配合 .NET 9。若项目仍在 .NET 6/8 或 C# 12,仍需沿用传统方式。可通过项目文件中的 preview 提前试用,但生产环境建议等正式发布。

何时该用、何时不用?

推荐使用场景:合并多个同类型集合;快速创建副本;动态组装配置、路径、参数列表;构造包含固定头尾和中间动态内容的集合。

暂不推荐场景:需要对元素做映射、过滤、排序等变换;处理超大集合(大于100万项),且对内存分配有极致要求;项目尚未升级到 .NET 9 / C# 13。

结语

展开运算符不是颠覆性创新,而是 C# 向“少写代码、多表意图”迈出的扎实一步。它不增加新概念,只是把开发者早已习惯的“展开”思维——如 JavaScript 的 ...、Python 的 *——自然地融入 C# 语法。

当一段集合操作需要反复读三遍才能看懂时,不妨试试 ..。往往一行简洁代码,胜过十行“正确但繁琐”的旧式写法。毕竟,好代码不仅要能跑,更要让人一眼看懂——这正是现代 C# 持续进化的核心目标。

来源:https://www.51cto.com/article/834073.html
上一篇2026款宋Pro DM-i 220km版:长续航强配置引领家庭出行 下一篇利民FT140双塔风冷:7热管回流焊,双LCP风扇140与120mm
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
OpenClaw手机App上线,结果翻车了
科技数码 · 2026-07-01

OpenClaw手机App上线,结果翻车了

OpenClaw 官方宣布,已正式推出 iOS 和 Android 原生移动 App,用户如今可以在手机上使用这款主打“能真正帮你做事”的个人 AI 助手。官方在 X 上给出的定位也很直接:把 Agent 放进口袋里,让用户可以在移动端处理频道消息、任务和回复。从功能上看,OpenClaw 移动端并

优必选CEO周剑:家庭机器人生态核心投入过半精力
科技数码 · 2026-07-01

优必选CEO周剑:家庭机器人生态核心投入过半精力

先说几个核心判断:优必选正在布局一盘长远战略。创始人兼CEO周剑在近期一场媒体沟通会上,直接亮出了公司未来的发展路线——工业、商用、家庭陪伴机器人三条业务主赛道并行推进,现阶段每条线各占约一半精力。一边是已经能够稳定创造收入的工业场景,另一边则是他眼中“最具想象力与未来空间”的家庭陪伴领域。工业人形

CPO/NPO/OIO开启封装级光连接价值空间,技术路线尚未收敛
科技数码 · 2026-07-01

CPO/NPO/OIO开启封装级光连接价值空间,技术路线尚未收敛

6月30日,申银万国在光连接系列研报中重点指出,MPO光连接器领域的投资机会值得高度关注。通俗来说,随着AI算力集群持续扩张,光互联升级带来的连锁效应——数据中心光纤通道数量、前面板端口密度、机柜内光纤管理复杂度——均在同步攀升。光连接器的角色早已超越传统的低价值标准件,如今它直接决定着链路插损、可

龙岗AR实景剧本游内测体验短板有效破解之道
科技数码 · 2026-07-01

龙岗AR实景剧本游内测体验短板有效破解之道

在今年龙岗区第二届人工智能与机器人发展大会上,区级部门一次性推出了7个AI“龙搭子”。其中,名为“龙导游”的成果成为文商旅融合领域的核心亮点。据南都N视频记者了解,依托“龙导游”打造的全区全域AR实景剧本游“龙岗大陆”,已在今年五一假期发布了内测版本。经过一个月市场验证后,该项目正式启动面向全社会的

南下资金6月30日净买入中芯国际与建滔积层板
科技数码 · 2026-07-01

南下资金6月30日净买入中芯国际与建滔积层板

6月30日,南下资金持续大举买入港股,单日净流入金额高达58 95亿港元。接下来,我们直接盘点哪些个股获得资金青睐、哪些遭到减持: 净买入方面,中芯国际领跑全场,单日吸金19 33亿港元;建滔积层板紧随其后,净买入10 59亿港元;腾讯控股获得7 65亿港元净流入;智谱(02513 HK)也有6 5