UpTheCreek
UpTheCreek

Reputation: 32391

'Cropping' a list in c#

Given a Generic IList of some type, which contains a number of items, is there any way of 'cropping' this list, so that only the fist x items are preserved, and the rest discarded?

Upvotes: 2

Views: 1783

Answers (4)

LukeH
LukeH

Reputation: 269498

The existing answers create a new list containing a subset of items from the original list.

If you need to truncate the original list in-place then these are your options:

// if your list is a concrete List<T>
if (yourList.Count > newSize)
{
    yourList.RemoveRange(newSize, yourList.Count - newSize);
}

// or, if your list is an IList<T> or IList but *not* a concrete List<T>
while (yourList.Count > newSize)
{
    yourList.RemoveAt(yourList.Count - 1);
}

Upvotes: 6

Jon
Jon

Reputation: 437554

If you need to do it just with the IList<T> interface, then something like this is the solution:

for (int i = list.Count - 1; i >= numberOfElementsToKeep; --i) {
    list.RemoveAt(i);
}

Working backwards from the end of the list here, in order to avoid moving around data which will be deleted in subsequent loop iterations.

Upvotes: 1

usr-local-ΕΨΗΕΛΩΝ
usr-local-ΕΨΗΕΛΩΝ

Reputation: 26894

you have a very simple way to:

IList<T> list = [...]; //initialize
IList<T> newList = new List<T>(max);
for (i=0; i<max; i++) newList.Add(list[i]);

Note: max MUST be less or equal then list length (otherwise you get IndexOutOfBoundsException)

Upvotes: 1

Isak Savo
Isak Savo

Reputation: 35904

If you can use Linq, it's just a matter of doing

// Extraact the first 5 items in myList to newList
var newList = myList.Take(5).ToList();

// You can combine with .Skip() to extract items from the middle
var newList = myList.Skip(2).Take(5).ToList();

Note that the above will create new lists with the 5 elements. If you just want to iterate over the first 5 elements, you don't have to create a new list:

foreach (var oneOfTheFirstFive in myList.Take(5))
     // do stuff

Upvotes: 14

Related Questions