- 集合表達式 (`Collection Expressions`)
- 基本語法
- 支持的集合類型
- 展開運算符 (`..`)
- 基本用法
- 實際應用示例
- 創建新集合
- 合并集合
- 與現有API結合
- 性能考慮
- 高級用法
- 多維集合
- 自定義集合
- 注意事項
- 與傳統方式的比較
- 總結
集合表達式 (Collection Expressions
)
C# 12
引入了集合表達式,提供了一種更簡潔的方式來創建和初始化集合。
基本語法
// 創建數組
int[] array = [1, 2, 3];// 創建列表
List<int> list = [1, 2, 3];// 創建跨度(Span)
Span<int> span = [1, 2, 3];
支持的集合類型
集合表達式支持多種集合類型:
-
數組 (
T[]
) -
List<T>
-
Span<T>
和ReadOnlySpan<T>
-
實現了
IEnumerable<T>
并有合適Add
方法的類型
展開運算符 (..
)
展開運算符用于將現有集合的元素"展開"到新的集合中。
基本用法
int[] numbers1 = [1, 2, 3];
int[] numbers2 = [4, 5, 6];// 合并兩個數組
int[] combined = [.. numbers1, .. numbers2];
// [1, 2, 3, 4, 5, 6]// 添加額外元素
int[] withExtra = [.. numbers1, 10, 20, .. numbers2];
// [1, 2, 3, 10, 20, 4, 5, 6]
實際應用示例
創建新集合
// 傳統方式
List<string> oldWay = new List<string> { "A", "B", "C" };// 新方式
List<string> newWay = ["A", "B", "C"];
合并集合
List<int> first = [1, 2, 3];
List<int> second = [4, 5, 6];// 合并兩個列表
List<int> merged = [.. first, .. second];
與現有API結合
// 傳遞給需要IEnumerable的方法
ProcessNumbers([1, 2, 3, 4, 5]);void ProcessNumbers(IEnumerable<int> numbers)
{foreach (var num in numbers){Console.WriteLine(num);}
}
性能考慮
集合表達式通常能提供更好的性能
-
對于數組,編譯器會優化為直接的數組初始化
-
對于列表,編譯器會使用最有效的方式初始化
高級用法
多維集合
int[][] matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
自定義集合
要使自定義集合支持集合表達式,需要實現:
-
IEnumerable<T>
-
有一個可訪問的
Add
方法
public class CustomCollection<T> : IEnumerable<T>
{private readonly List<T> _items = new();public void Add(T item) => _items.Add(item);public IEnumerator<T> GetEnumerator() => _items.GetEnumerator();IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}// 使用
CustomCollection<int> custom = [1, 2, 3];
注意事項
-
展開運算符 (
..
) 只能用于集合表達式內部 -
集合表達式不能用于
null
值 -
目標類型必須明確(不能用于
var
推斷)
與傳統方式的比較
特性 | 集合表達式 | 傳統方式 |
---|---|---|
語法簡潔性 | ? 高(單行簡潔語法) | ? 低(需要更多樣板代碼) |
可讀性 | ??? 高(直觀表達意圖) | ?? 中等(結構略顯冗長) |
靈活性 | 🔄 高(支持混合元素和展開) | 🔄 高(但語法更復雜) |
性能 | ? 優化更好(編譯器特殊處理) | ? 一般(標準初始化流程) |
版本要求 | 🆕 C# 12+ | 🏛? 所有版本 |
總結
C#
的集合表達式和展開運算符提供了:
-
更簡潔的集合初始化語法
-
更直觀的集合合并方式
-
更好的代碼可讀性
-
編譯器優化的性能優勢
建議在新項目中使用這些特性,特別是在需要頻繁創建或合并集合的場景中。