Amit
Amit

Reputation: 1857

How to skip first few elements from array?

I have an array with total 5000 elements and at one functionality, I only need last 3000 elements only to proceed further.

for that I have tried following solution.

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

This solution is actually giving me desired solution, but when I ran profiler on my code, It is showing huge amount memory allocation on this line.

I have to use Array only due to carried on legacy. and very frequent ToArray() doesn't seem to be good for performance.

there is also possible solution,

//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);

but this is even worse in time complexity.

Is there any better solution for this, which doesn't need casting from List to Array ?

Upvotes: 1

Views: 4764

Answers (3)

Chandan kr
Chandan kr

Reputation: 1

you can use Skip(Provide number which you want to exclude).ToArray();

Upvotes: -4

Tim Schmelter
Tim Schmelter

Reputation: 460258

If list is a List<> you can use List.GetRange:

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

This is more efficient because List.ToArray uses Array.Copy.


If list is an int[] as commented it's even more efficient:

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

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1503180

If you absolutely have to use an array, then Array.Copy is probably your friend:

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

I'd expect that to be a bit more efficient than using Take followed by ToArray.

Upvotes: 6

Related Questions