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

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
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

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

同类最新

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

更多
神舟二十一号航天员张陆武飞张洪章顺利出舱
科技数码 · 2026-05-30

神舟二十一号航天员张陆武飞张洪章顺利出舱

神舟二十一号航天员张陆、武飞、张洪章在圆满完成空间站各项既定任务后,于今日全部安全顺利出舱,身体状态良好。此次任务的成功,标志着中国空间站应用与发展阶段又一次任务周期圆满闭合。

宇树科技亚洲首店上海静安开业 紧邻苹果零售店
科技数码 · 2026-05-30

宇树科技亚洲首店上海静安开业 紧邻苹果零售店

宇树科技亚洲首店在上海市静安区久光百货开业,毗邻苹果零售店。门店面积超100平方米,集中展示G1人形机器人、R1双臂机器人等产品,开放沉浸式互动体验,旨在打造具身智能线下体验入口。

神舟二十一号航天员乘组创造中国在轨驻留最长纪录
科技数码 · 2026-05-30

神舟二十一号航天员乘组创造中国在轨驻留最长纪录

神舟二十一号航天员乘组圆满完成飞行任务,刷新了中国航天员乘组在轨驻留最长纪录,在轨工作生活时间创历史新高,进一步验证了空间站长期驻留保障能力,为后续深空探索奠定坚实基础。

Counterpoint报告:TCL加速追赶三星,电视行业格局面临洗牌
科技数码 · 2026-05-30

Counterpoint报告:TCL加速追赶三星,电视行业格局面临洗牌

2026年第一季度全球电视出货量同比增长3%,三星出货量增8%,TCL猛增22%并创历史新高,其MiniLED液晶电视成为核心增长引擎。各品牌竞争加剧,三星降价、LG推入门级OLED、海信与TCL深耕MiniLED。此外,三星换帅推动平台化,TCL与索尼合资,传闻LG电视业务或出售给海信,行业面临深度洗牌。

领克10与10+上市16.99万起 900V架构高性能运动轿车
科技数码 · 2026-05-30

领克10与10+上市16.99万起 900V架构高性能运动轿车

领克10与10+正式上市,限时起售价16 99万元至21 99万元。全系基于SEA浩瀚架构,标配900V高压平台,续航最高816公里,快充达“1秒极充2公里”。高性能版双电机四驱,3 2秒破百,曾登顶天门山弯道之王。操控由纽北团队调校,麋鹿测试85 4km h。标配激光雷达、8295芯片,高配可选Thor-U芯片实现高阶智驾。整车扭转刚度45500Nm de