Инициализация массива C # - со значением не по умолчанию - PullRequest
32 голосов
/ 26 сентября 2008

Какой самый удобный способ инициализации массива динамического размера в C #, о котором вы знаете?

Это лучшее, что я мог придумать

private bool[] GetPageNumbersToLink(IPagedResult result)
{
   if (result.TotalPages <= 9)
      return new bool[result.TotalPages + 1].Select(b => true).ToArray();

   ...

Ответы [ 6 ]

73 голосов
/ 27 июня 2009

Если под 'гладким' вы подразумеваете самый быстрый, я боюсь, что Enumerable.Repeat может быть в 20 раз медленнее, чем для цикла. Смотри http://dotnetperls.com/initialize-array:

Initialize with for loop:             85 ms  [much faster]
Initialize with Enumerable.Repeat:  1645 ms 

Так что используйте метод SetAllValues ​​() Dotnetguy.

36 голосов
/ 26 сентября 2008

использовать Перечислим. Повтор

Enumerable.Repeat(true, result.TotalPages + 1).ToArray()
14 голосов
/ 26 сентября 2008

РЕДАКТИРОВАТЬ: как отметил комментатор, моя первоначальная реализация не сработала. Эта версия работает, но довольно непривлекательно, поскольку основана на цикле for.

Если вы хотите создать метод расширения, вы можете попробовать это

public static T[] SetAllValues<T>(this T[] array, T value) where T : struct
{
    for (int i = 0; i < array.Length; i++)
        array[i] = value;

    return array;
}

и затем вызывайте его вот так

bool[] tenTrueBoolsInAnArray = new bool[10].SetAllValues(true);

В качестве альтернативы, если вы довольны, что у вас есть класс, вы можете попробовать что-то вроде этого

public static class ArrayOf<T>
{
    public static T[] Create(int size, T initialValue)
    {
        T[] array = (T[])Array.CreateInstance(typeof(T), size);
        for (int i = 0; i < array.Length; i++)
            array[i] = initialValue;
        return array;
    }
}

который вы можете вызвать как

bool[] tenTrueBoolsInAnArray = ArrayOf<bool>.Create(10, true);

Не уверен, какой из них я предпочитаю, хотя в целом я использую методы расширения lurv.

5 голосов
/ 26 сентября 2008

Я бы на самом деле предложил это:

return Enumerable.Range(0, count).Select(x => true).ToArray();

Таким образом, вы выделяете только один массив. По сути, это более краткий способ выразить:

var array = new bool[count];

for(var i = 0; i < count; i++) {
   array[i] = true;
}

return array;
1 голос
/ 09 октября 2014

Много раз вы хотели бы инициализировать разные ячейки с разными значениями:

public static void Init<T>(this T[] arr, Func<int, T> factory)
{
    for (int i = 0; i < arr.Length; i++)
    {
        arr[i] = factory(i);
    }
}

Или в заводском аромате:

public static T[] GenerateInitializedArray<T>(int size, Func<int, T> factory)
{
    var arr = new T[size];
    for (int i = 0; i < arr.Length; i++)
    {
        arr[i] = factory(i);
    }
    return arr;
}
0 голосов
/ 26 сентября 2008

Не проверено, но не могли бы вы сделать это?

return result.Select(p => true).ToArray();

Пропуск части "new bool []"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...