在 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 中非常实用的特性。
本文使用 文章同步助手 同步