如何从静态列表创建FrozenDictionary?
从静态列表创建FrozenDictionary的更优方法?
普通字典可以通过静态列表初始化的方式快速创建:
var dictionary = new Dictionary<int, string> {{1, "Hello" }};
但FrozenDictionary是抽象类,无法直接用这种集合初始化语法创建:
// 此写法无效,FrozenDictionary是抽象类 // var frozen = new FrozenDictionary<int, string> {{1, "Hello" }};
目前有两种可行但存在明显缺点的实现方式:
- 先创建
KeyValuePair数组再转换:代码繁琐,还会产生额外的堆内存分配var array = new KeyValuePair<int, string>[]{ new (1, "Hello" )}; var frozen = array.ToFrozenDictionary(); - 先创建普通字典再冻结:会经历两次字典构造过程,效率较低
var dictionary = new Dictionary<int, string> {{1, "Hello" }}; var frozen2 = dictionary.ToFrozenDictionary();
更优的实现方式
根据你使用的.NET版本和C#版本,有两种更高效简洁的方案:
使用
FrozenDictionary.Create静态方法(.NET 6+)
直接传入键值对序列,无需构造中间字典或额外数组分配,框架会直接构建冻结字典:// 传入KeyValuePair数组 var frozen = FrozenDictionary.Create(new[] { KeyValuePair.Create(1, "Hello") }); // 更简洁:传入值元组序列,框架自动转换 var frozen = FrozenDictionary.Create(new[] { (1, "Hello") });集合表达式(C# 12+)
借助C# 12的集合表达式语法,写法最简洁,且编译器会优化中间过程,减少不必要的内存开销:var frozen = [ (1, "Hello") ].ToFrozenDictionary();
这两种方式都能避免之前方案的缺点,既保证代码简洁,又减少内存分配和构造开销。
内容的提问来源于stack exchange,提问作者MarkusParker
相关产品推荐
相关产品推荐

