给定某种类型的通用IList
,其中包含许多项目,是否有任何方法可以“裁剪”此列表,以便只保留第一个x项,其余的被丢弃?
答案 0 :(得分:13)
如果你可以使用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
答案 1 :(得分:6)
现有答案会创建一个新列表,其中包含原始列表中的项目子集。
如果您需要就地截断原始列表,那么这些是您的选择:
// 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);
}
答案 2 :(得分:1)
你有一个非常简单的方法:
IList<T> list = [...]; //initialize
IList<T> newList = new List<T>(max);
for (i=0; i<max; i++) newList.Add(list[i]);
注意:max必须小于或等于列表长度(否则你得到IndexOutOfBoundsException
)
答案 3 :(得分:1)
如果你只需要使用IList<T>
界面,那么就是这样的解决方案:
for (int i = list.Count - 1; i >= numberOfElementsToKeep; --i) {
list.RemoveAt(i);
}
从列表末尾开始向后工作,以避免移动将在后续循环迭代中删除的数据。