我想知道是否有更好的方法来初始化一个引用类型对象数组,就像这样。
Queue<int>[] queues = new Queue<int>[10];
for (int i = 0; i < queues.Length; i++)
queues[i] = new Queue<int>();
我尝试了Enumerable.Repeat,但是数组中的所有元素都引用了相同的实例
Queue<int>[] queues = Enumerable.Repeat(new Queue<int>(), 10).ToArray();
我也尝试过Array.ForEach,但没有ref关键字它不起作用:
Queue<int>[] queues = Array.ForEach(queues, queue => queue = new Queue<int>());
还有其他想法吗?
答案 0 :(得分:6)
你可以用这个:
Enumerable.Range(0,10).Select(_=>new Queue<int>()).ToArray()
但IMO你的第一个例子也很好。
答案 1 :(得分:4)
不,没有。只需将其分解为实用方法:
// CommonExtensions.cs
public static T[] NewArray<T> (int length) where T : class, new ()
{
var result = new T[length] ;
for (int i = 0 ; i < result.Length ; ++i)
result[i] = new T () ;
return result ;
}
// elsewhere
var queues = Extensions.NewArray<Queue<int>> (10) ;
答案 2 :(得分:0)
我有相同的答案 - 使用循环。但是你可以把它作为通用的扩展方法:
public static void Init<T>(this IList<T> array )
{
if (array == null) return;
for (int i = 0; i < array.Count; i++)
array[i] = Activator.CreateInstance<T>();
}
然后就叫它:
Queue<int>[] queues = new Queue<int>[10];
queues.Init();