将列表的n个元素复制到新列表中。

3

我有一个List<Mail> mails,想要将前100个元素复制到一个新列表中,因为我想在数据网格中显示它们。但是mails可能包含超过9000个元素,如果我使用mails,那么这将需要太长时间。

2个回答

6

LINQ Take():

var first100Mails = new List<Mail>(mails.Take(100));

2

对于一个 List<T>,最有效的方法可能是使用其内置的 List<T>.GetRange(int index, int count) 方法。

var result = mails.GetRange(0, 100);

这种实现可能比使用Linq更有效,因为List<>实现可以利用私有数据进行优化。

实现方式如下(来自Reflector):

List<T> list = new List<T>(count);
Array.Copy(this._items, index, list._items, 0x0, count);
list._size = count;
return list;

那么这将是尽可能快的速度。

进行了快速测试,结果比Take快了近12倍,但瓶颈似乎是在使用Take时需要进行的ToList转换。如果保留Take的默认IEnumerable结果,则比GetRange更快(但两者都在循环1m次的情况下运行在400ms以下)。 - keyboardP
如果您在Linq代码中不调用ToList(),它实际上不会执行任何操作,因此速度肯定会更快。 - Matthew Watson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接