'裁剪'c#中的列表

时间:2010-12-08 12:31:48

标签: c# collections

给定某种类型的通用IList,其中包含许多项目,是否有任何方法可以“裁剪”此列表,以便只保留第一个x项,其余的被丢弃?

4 个答案:

答案 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);
}

从列表末尾开始向后工作,以避免移动将在后续循环迭代中删除的数据。