如何跳过数组中的前几个元素?

时间:2017-07-05 14:07:26

标签: c# arrays winforms optimization memory-management

我有一个总共5000个元素的数组,在一个功能中,我只需要最后3000个元素才能继续进行。

为此我尝试了以下解决方案。

//skipping first 2000 elements
list = list.Skip(5000 - 3000).ToArray();

这个解决方案实际上给了我想要的解决方案,但是当我在我的代码上运行profiler时,它在这一行显示了大量的内存分配。

由于遗留下来,我必须使用Array。并且非常频繁地ToArray()似乎对表现不利。

还有可能的解决方案,

//reversing whole list
Array.Reverse(list);
//restricting size of an array to 3000,
//so first (as reversed the list, they are last 3000 elements) 
Array.Resize(ref list, 3000);
//again reversing list to make it proper order
Array.Reverse(list);

但时间复杂度更差。

有没有更好的解决方案,不需要从List转换为数组?

3 个答案:

答案 0 :(得分:6)

如果您绝对 使用数组,那么Array.Copy可能是您的朋友:

int[] smallerArray = new int[array.Length - 2000];
Array.Copy(array, 2000, smallerArray, 0, smallerArray.Length);

我希望这比使用Take后跟ToArray更有效率。

答案 1 :(得分:1)

如果listList<>,您可以使用List.GetRange

int lastN = 3000;
var sublist = list.GetRange(list.Count - lastN, lastN);
var array = sublist.ToArray();

这更有效,因为List.ToArray使用Array.Copy

如果list是评论的int[],那就更有效了:

int lastN = 3000;
int[] result = new int[lastN];
Array.Copy(list, list.Length - lastN, result, 0, lastN); 

答案 2 :(得分:-4)

你可以使用Skip(提供你要排除的号码).ToArray();