我有一个总共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转换为数组?
答案 0 :(得分:6)
如果您绝对 使用数组,那么Array.Copy
可能是您的朋友:
int[] smallerArray = new int[array.Length - 2000];
Array.Copy(array, 2000, smallerArray, 0, smallerArray.Length);
我希望这比使用Take
后跟ToArray
更有效率。
答案 1 :(得分:1)
如果list
是List<>
,您可以使用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();