C#数组初始化-具有非默认值

时间:2020-03-06 14:45:25  来源:igfitidea点击:

我们知道的在C中初始化动态大小数组的最巧妙方法是什么?

这是我能想到的最好的

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

   ...

解决方案

未经测试,但是我们可以这样做吗?

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

跳过"新bool []"部分?

我实际上建议这样做:

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;

编辑:正如评论员指出的那样,我的原始实现无法正常工作。这个版本可以使用,但是基于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);

尽管我通常会做很多很多的吸引人的扩展方法,但不确定我喜欢哪一种。

使用Enumerable.Repeat

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

如果说"最聪明"是指最快,那么恐怕Enumerable.Repeat可能比for循环慢20倍。
请参阅http://dotnetperls.com/initialize-array:

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

因此,请使用Dotnetguy的SetAllValues()方法。