2015-04-01 55 views
1

我想与长度X的创建一个数组,并且我想下面“智力”最快的方法创建NumberSequence数组

如果,为例,X = 6, myArray的[X ] = [0,1,2,3,4,5]

就目前而言,我做

int[] availableIndex = new int[DestructiblesCubes.Count]; 
for (var i = 0; i < availableIndex.Length; i++) 
{ 
    availableIndex[i] = i; 
} 

不过,我很好奇,有没有执行它一个更好的(更快的方式)和/或更快(最短的字符长度)方式?

谢谢:)

+1

请指定* fast *(* better *)...快速执行时间或实现目标的简短方法? – 2015-04-01 09:47:12

+0

因为我只是好奇,展位:D – Crocsx 2015-04-01 09:48:58

+0

我可能是错的,但你不能有最佳的代码你可以有最短的代码,或者你可以有最快的代码,但不是两个。 – 2015-04-01 09:56:07

回答

2

我认为最快方法一起使用unsafe上下文以适当fixed指向数组,如下面所示:

/*const*/ int availableIndex_Length = 6; 
int[] availableIndex = new int[availableIndex_Length]; 
unsafe { 
    fixed(int* p = &availableIndex[0]) { 
     for(int i = 0; i < availableIndex_Length; ++i) { 
      *(p+i) = i; 
     } 
    } 
} 

这可以是重构为方法,可选地inline d:

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
static unsafe void FillRange(ref int[] array) { 
     int length = array.Length; 
     fixed(int* p = &array[0]) { 
      for(int i = 0; i < length; ++i) { 
       *(p + i) = i; 
      } 
     } 
} 

static void Main(string[] args) { 
    // Example usage: 
    int[] availableIndices = new int[6]; 
    FillRange(ref availableIndices); 

    // Test if it worked: 
    foreach(var availableIndex in availableIndices) { 
     Console.WriteLine(availableIndex); 
    } 
    Console.ReadKey(true); 
} 
4

这是执行此操作的简短方法。不是性能最好的解决方案。

Enumerable.Range(0, 10).ToArray() 

MSDN描述为Enumerable.Range

+1

请注意,这是更少的代码,但比执行时使用for循环慢得多。 – 2015-04-01 09:53:53

+0

@MeAndSomeRandoms完全同意,这是'更快(最短的字符长度)方式的问题的答案' – Artiom 2015-04-01 09:55:52

+0

Thx!,不知道这个解决方案,只是为了“知识”,我不会使用它:) – Crocsx 2015-04-01 10:05:08

1

我可以看到应用到你的代码,因为它代表的只是优化是倒数至零,但在性能上的任何增加将微小

int[] availableIndex = new int[DestructiblesCubes.Count]; 
for (var i = availableIndex.Length-1; i >= 0; i--) 
{ 
    availableIndex[i] = i; 
} 

否则,特别是如果你说大数组,有一点要尝试创建的数组大于最大设想值DestructiblesCubes.Count和 如上所述初始化该数组,然后在想要更小的数组时使用Array.Copy
我相信没有我们手动滚动的代码会比单次调用Array.Copy更快。

int[] availableIndex = new int[DestructiblesCubes.Count]; 
Array.Copy(LargeArray, availableIndex, availableIndex.Length); 

否则我不能想到任何可能比你的代码更快的东西。

1

你可以试试这个:

unsafe 
{ 
    int[] availableIndex = new int[DestructiblesCubes.Count]; 
    int length = availableIndex.Length; 
    int n = 0; 
    fixed(int *p = availableIndex) { 
     while(n < length) *p++ = n++; 
    } 
} 

可能更快,这取决于你的编译器的优化阶段。