C#数组初始化 - 使用非默认值

时间:2008-09-25 23:22:34

标签: c# .net

在C#中初始化动态大小数组的最简单方法是什么?

这是我能想到的最好的

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

   ...

6 个答案:

答案 0 :(得分:73)

如果用'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()方法。

答案 1 :(得分:36)

使用Enumerable.Repeat

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

答案 2 :(得分:14)

编辑:正如评论者指出的那样,我原来的实现没有用。这个版本可以工作,但是基于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扩展方法。

答案 3 :(得分:5)

我实际上会建议:

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;

答案 4 :(得分:1)

很多时候,您需要使用不同的值初始化不同的单元格:

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

答案 5 :(得分:0)

未经测试,但你可以这样做吗?

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

跳过“新书[]”部分?