2010-12-08 68 views
1

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

回答

5

现有答案将创建一个新列表,其中包含原始列表中的项目子集。

如果您需要截断就地原始列表,那么这些是你的选择:

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

如果你可以使用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个元素,你不必创建一个新的列表:

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

+1爱我一些LINQ – n8wrl 2010-12-08 12:52:13

+0

+1包括事实,你并不需要做.ToList ()除非你明确需要创建一个新的列表。 – 2010-12-08 13:13:05

1

你有一个非常简单的方法:

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

注:MAX必须小于或等于则列表长度(否则你会得到IndexOutOfBoundsException

1

如果你只需要与IList<T>接口做到这一点,那么像这样的解决方案:

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

为了避免在随后的循环迭代中被删除的数据在这里从列表末尾开始反向工作。