List<AttendeeInfo> attendees = new List<AttendeeInfo>();
foreach ...
// Error: "There are too many target users in the email address array"
// for more than 100 attendees. So take the first 100 attendees only.
if(attendees.Count > 100) attendees = attendees.GetRange(0,100);
// or
if(attendees.Count > 100) attendees = attendees.Take(100).ToList();
字符串
由于我处理的列表总是超过100,并且总是取前100个,因此最明显的差异(评估策略,跳过的可能性,抛出错误)并不真正有趣。
但是也许你可以解释一下“在源列表中创建一个元素范围的浅拷贝”到底是什么意思。这听起来真的很昂贵,比Take还贵,但是它是吗?
6条答案
按热度按时间bqjvbblv1#
唯一的区别是
List.GetRange
比Take(n).ToList()
更有效,因为它已经知道新列表的大小,而LINQ方法不知道它的大小。所以
ToList
枚举序列,并使用加倍算法连续增加支持数组将项目添加到新列表中。List.GetRange
可以预先创建具有正确初始大小的正确列表,然后使用Array.Copy
将源列表的子集复制到新列表[source]中。wj8zmpe12#
它要快得多。看看这个:
字符串
经过时间:
List.GetRange()
:0.149秒List.Take().ToList()
:3.625秒tag5nh1u3#
下面是**
GetRange
**的实现:字符串
这是**
Take
**实现型
加上
ToList
,它可以简单地做到:型
List
构造函数:型
您可以立即注意到
GetRange
比Take
便宜多少zzzyeukh4#
List.Take(100).ToList(),如果不知道列表中的元素个数,会更合适,如果小于100,只取可用的元素。这样使用更灵活。
另一方面,**List.GetRange(0,100)**假设列表中的元素数量大于100。但您会得到此错误 *
偏移量和长度超出数组的界限,或者计数大于从索引到源集合末尾的元素数
对我来说,我会说List.Take(100).ToList()更通用,因为它不限制使用。
pxiryf3j5#
在
Take
和GetRange
之间有一个minor。Take将延迟求值,直到您强制它求值为ToList()
。这可能会改变行为。考虑伪代码。
字符串
现在将此示例更改为以下代码。
型
执行
ToList()
可以改变Take或GetRange的行为,这取决于您接下来使用的操作。使用GetRange总是更容易,因为它不会导致任何未知的bug。GetRange也很高效。
dffbzjpn6#
我会补充说,如果你不需要在
Take
的结果上调用ToList
,它比GetRange
快得多。从Kendrzu的例子中删除
ToList
,你会得到:字符串
经过时间:
List.GetRange()
:0.074sList.Take()
:0.032s当您可能不需要在
Take
的结果上调用ToList
时的示例:型
无论我使用
Take
还是GetRange
,我都需要调用ToList
,所以所花费的时间不会影响我在Take
和GetRange
之间的决定。