You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 8.0是否内置构造引用类型数组并初始化每个元素的方法?

回答

好问题!你的自定义ConstructArray函数确实精准解决了引用类型数组初始化的痛点——不用硬编码元素个数,还能保证每个元素都是独立的新实例。在C# 8.0里,你可以用LINQ的组合方法来替代这个自定义函数,无需自己写循环:

推荐的内置解决方案

使用Enumerable.Range配合Select,代码简洁且能达到你的要求:

class Example {
    const int NumberOfLists = 3;
    List<int>[] listInit = Enumerable.Range(0, NumberOfLists)
                                     .Select(_ => new List<int>())
                                     .ToArray();
}

原理说明

  • Enumerable.Range(0, NumberOfLists):生成一个从0开始、长度为NumberOfLists的整数序列,用来模拟循环的索引。
  • Select(_ => new List<int>()):对序列中的每个元素(这里不需要索引值,用_作为占位符)创建一个新的TElem实例,确保每个数组元素都是独立对象。
  • ToArray():将最终的序列转换为目标类型的数组。

需要避开的坑

别用Enumerable.Repeat来实现这个需求!对于引用类型,它会重复返回同一个实例,导致所有数组元素指向同一个对象:

// 错误示例!所有List<int>共享同一个实例
List<int>[] badList = Enumerable.Repeat(new List<int>(), NumberOfLists).ToArray();

这种写法看起来简洁,但完全不符合你的需求——往任意一个List添加元素,所有List都会同步变化,一定要避开。

补充说明

C# 8.0本身没有专门的数组初始化语法直接实现“指定长度+每个元素新实例”,但上述LINQ的组合写法已经是内置的、便捷的解决方案,足够替代你的自定义工具函数。

内容的提问来源于stack exchange,提问作者Jason C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:32:44