«Обрезка» списка в c # - PullRequest
       1

«Обрезка» списка в c #

2 голосов
/ 08 декабря 2010

Учитывая универсальный IList некоторого типа, который содержит несколько элементов, есть ли способ «обрезать» этот список, так что сохраняются только элементы первого х, а остальные отбрасываются?

Ответы [ 4 ]

13 голосов
/ 08 декабря 2010

Если вы можете использовать Linq, это просто вопрос

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

Обратите внимание, что выше будет создавать новые списки с 5 элементами. Если вы просто хотите перебрать первые 5 элементов, вам не нужно создавать новый список:

foreach (var oneOfTheFirstFive in myList.Take(5))
     // do stuff
6 голосов
/ 08 декабря 2010

Существующие ответы создают новый список, содержащий подмножество элементов из исходного списка.

Если вам нужно усечь исходный список на месте, тогда вам подойдут следующие варианты:

// 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);
}
1 голос
/ 08 декабря 2010

Если вам нужно сделать это только с помощью интерфейса IList<T>, то решение будет примерно таким:

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

Работа в обратном направлении от конца списка здесь, чтобы избежать перемещенияданные, которые будут удалены в последующих итерациях цикла.

1 голос
/ 08 декабря 2010

у вас есть очень простой способ:

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

Примечание: максимум ДОЛЖЕН быть меньше или равен длине списка (в противном случае вы получите IndexOutOfBoundsException)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...