Подтвердить что ты не робот

Инициализация массива С# - с нестандартным значением

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

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

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

   ...
4b9b3361

Ответ 1

использовать Enumerable.Repeat

Enumerable.Repeat(true, result.TotalPages + 1).ToArray()

Ответ 2

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

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

Поэтому используйте метод Dotnetguy SetAllValues ​​().

Ответ 3

EDIT: как отметил комментатор, моя первоначальная реализация не сработала. Эта версия работает, но довольно негладкая, основанная на цикле 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 методы расширения много и много в целом.

Ответ 4

Я бы предположил это:

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;

Ответ 5

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

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

Или в цвете factory:

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;
}

Ответ 6

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

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

Пропустить "новую часть bool []"?