还在使用ToList太Low了

在 C# 12 及以上版本中,引入了集合表达式 (Collection Expressions),这是一种简洁、直观的语法,用于创建常见集合(如 List<T>、array、HashSet<T> 等)。它简化了集合的初始化代码,让代码更易读。

基本语法

集合表达式使用 [] 包裹元素,语法格式:

ini 复制代码
var collection = [element1, element2, ..., elementN];

根据变量的目标类型(或显式声明的类型),编译器会自动创建对应的集合实例。

常见用法

1. 创建数组(Array)

ini 复制代码
// 隐式类型数组(编译器推断为 int[])
var numbers = [1, 2, 3, 4];

// 显式类型数组
string[] fruits = ["apple", "banana", "cherry"];

2. 创建 List

csharp 复制代码
// 隐式类型(需结合 var 和目标类型推断)
List<int> intList = [10, 20, 30];

// 也可通过 var + 目标类型推断(C# 12 支持)
var strList = ["a", "b", "c"] as List<string>; // 不常用,建议显式声明

3. 创建 HashSet

ini 复制代码
HashSet<string> uniqueNames = ["Alice", "Bob", "Alice"]; // 自动去重

4. 嵌套集合

集合表达式支持嵌套,用于创建多维或复杂结构:

lua 复制代码
// 二维数组
int[][] matrix = [[1, 2], [3, 4], [5, 6]];

// List 嵌套
List<List<int>> nestedList = [[1, 2], [3, 4]];

5. 合并集合(展开运算符 ..)

使用 .. 可以将一个集合的元素"展开"并合并到新集合中,类似其他语言的"扩展运算符":

ini 复制代码
var a = [1, 2, 3];
var b = [4, 5];

// 合并两个集合(结果:[1,2,3,4,5])
var combined = [.. a, .. b];

// 中间插入新元素(结果:[1,2,3, 99, 4,5])
var withExtra = [.. a, 99, .. b];

6. 与 LINQ 结合

集合表达式可以直接使用 LINQ 查询的结果(通过 .. 展开):

ini 复制代码
var numbers = [1, 2, 3, 4, 5, 6];

// 筛选偶数并创建新集合
List<int> evenNumbers = [.. numbers.Where(n => n % 2 == 0)];

支持的集合类型

集合表达式支持所有实现了 ICollection<T> 或 IEnumerable<T> 且有合适构造函数(如无参构造函数 + Add 方法,或接受 IEnumerable<T> 的构造函数)的类型,常见包括:

  • T[]

    (数组)

  • List<T>

  • HashSet<T>

  • Dictionary<TKey, TValue>

    (需指定键值对,如 [["a", 1], ["b", 2]])

  • 自定义集合类型(需符合上述接口和构造函数要求)

优势

  • 简洁性

    :相比传统的 new List<T> { ... } 语法更简短。

  • 灵活性

    :通过 .. 运算符轻松合并多个集合。

  • 可读性

    :直观表达集合的内容,减少样板代码。

注意事项

  • 集合表达式是 C# 12 新增特性,需确保项目的语言版本设置为 C# 12 及以上(在 .csproj 中设置 <LangVersion>12.0</LangVersion>)。

  • 对于 Dictionary<TKey, TValue>,元素需用 [key, value] 形式表示(本质是通过 ValueTuple 转换):``` Dictionary<string, int> dict = \["one", 1, "two", 2];

    复制代码

集合表达式大幅简化了集合初始化代码,尤其适合创建小型集合或合并多个集合的场景,是 C# 12 中非常实用的特性。

本文使用 文章同步助手 同步

相关推荐
掘金者阿豪27 分钟前
MongoDB迁移到金仓数据库:商品属性继续灵活存,订单报表交给 SQL
前端·后端
zhoujungis28 分钟前
限流算法实测:固定窗口 2 倍溢出、令牌桶突刺 | 尘世栈帧
后端
小蒜学长1 小时前
编程语言在线学习平台的设计与实现(代码+数据库+LW)
java·spring boot·后端·编程语言在线学习平台·在线编码
zhoujungis3 小时前
登录态 1 小时就掉?Django + Vue 双 Token 认证实战 | 尘世栈帧
后端
武子康3 小时前
同一台 ESP32,GSM 能消回声,VoIP 为什么不行?
人工智能·后端·agent
用户69371750013843 小时前
AI 能写代码,但工程架构还是应该由人来定
前端·后端
lqbzlll3 小时前
Spring Boot 开启虚拟线程后接口反而变慢了?4 个排查方向和对应修法
java·spring boot·后端
回家路上绕了弯3 小时前
让 AI 成为团队的共同能力
后端
70后写java的老码农3 小时前
一个 starter 通吃 9 家主流大模型:Spring Boot 3.x + Spring AI 1.x 极简落地
后端
武子康4 小时前
MultiNet 只听到一次命令,为什么连续触发?
人工智能·后端·agent