Вопрос по linq, c# – Краткий способ инициализации массива объекта ссылочного типа

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

любая другая идея?

Согласовано. Что не так с циклом? Ed S.
Лично я думаю, что ваш первый пример вполне приемлем. Tim S.
Я знаю, что мой первый пример полностью подходит, просто любопытно, есть ли другой вариант. lidong

Ваш Ответ

3   ответа
6

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

Но ИМО ваш первый пример тоже отлично.

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();
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) ;
IMO Раздувание API такими специализированными вспомогательными функциями обычно не стоит.
@ Хэтчет, да, это именно то, о чем спрашивает вопрос.
Это не API. Объявите это во внутреннем классе, если хотите.
@ L.B - похоже, он вернул бы массив Queue & lt; int & gt;

Похожие вопросы