如何无需手动逐个初始化,用默认构造函数初始化C#引用类型数组?
初始化C#引用类型数组的简便方法
嘿,我完全懂你不想手动调用100000次new Person()的崩溃感——谁愿意做这种机械重复的工作啊!其实除了for循环,C#确实有更简洁的方式来批量初始化引用类型数组,下面给你几种实用的方案:
1. 使用LINQ的Enumerable.Range + Select + ToArray
这是最常用的简洁写法,一行代码就能搞定:
Person[] people = Enumerable.Range(0, 100000) .Select(_ => new Person()) .ToArray();
这里Enumerable.Range(0, 100000)生成0到99999的整数序列,然后Select把每个整数映射成一个新的Person对象,最后ToArray()把序列转换成数组。如果你的Person构造需要参数,也可以直接传入,比如:
Person[] people = Enumerable.Range(0, 100000) .Select(i => new Person($"Person_{i}")) .ToArray();
2. 用Array.ForEach批量初始化
先创建指定长度的空数组(此时所有元素都是null),再通过Array.ForEach遍历初始化每个元素:
Person[] people = new Person[100000]; Array.ForEach(people, (ref Person p) => p = new Person());
3. 自定义扩展方法(复用性更高)
如果你经常需要做这种批量初始化,可以封装一个扩展方法,后续使用更省心:
public static class ArrayExtensions { public static T[] InitializeArray<T>(int length) where T : new() { T[] array = new T[length]; for (int i = 0; i < length; i++) { array[i] = new T(); } return array; } }
调用时只需一行:
Person[] people = ArrayExtensions.InitializeArray<Person>(100000);
性能小提醒
如果对性能要求极高,手动写for循环是最快的(LINQ会带来极轻微的额外开销,10万量级几乎可忽略):
Person[] people = new Person[100000]; for (int i = 0; i < people.Length; i++) { people[i] = new Person(); }
日常开发中,LINQ写法的简洁性和可读性往往更值得优先考虑。
内容的提问来源于stack exchange,提问作者Christopher Pisz
相关产品推荐
相关产品推荐

