4

このように、参照型オブジェクトの配列を初期化するためのより良い方法はあるのでしょうか。

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>());

他のアイデアはありますか?

4

3 に答える 3

6

これを使用できます:

Enumerable.Range(0,10).Select(_=>new Queue<int>()).ToArray()

しかし、IMO の最初の例もまったく問題ありません。

于 2012-09-07T21:31:22.847 に答える
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) ;
于 2012-09-07T21:24:54.720 に答える
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();
于 2012-09-07T21:35:57.677 に答える