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();
Run Code Online (Sandbox Code Playgroud)
由于我的列表总是超过100,并且始终占据前100个,因此最明显的差异(评估策略,跳过可能性,抛出错误)并不是很有趣.
但也许您可以了解究竟"创建源列表中一系列元素的浅层副本"的含义.这听起来真的很贵,比Take更重要,但是呢?
Tim*_*ter 20
唯一的区别是,它List.GetRange比Take(n).ToList()已经知道新列表的大小更有效,而LINQ方法不知道它的大小.
因此,ToList枚举序列并使用加倍算法将项添加到新列表中,从而连续增加后备阵列.List.GetRange可以预先创建具有正确初始大小的正确列表,然后使用Array.Copy将源列表的子集复制到新列表[ source ]中.
它要快得多.看一下这个:
var list = Enumerable.Range(0, 1000).ToList();
var stopwatch = new Stopwatch();
stopwatch.Start();
for(var i=0; i<1000000; i++)
{
var c = list.GetRange(0, 100);
}
Console.WriteLine(stopwatch.Elapsed);
stopwatch.Restart();
for (var i = 0; i < 1000000; i++)
{
var c = list.Take(100).ToList();
}
Console.WriteLine(stopwatch.Elapsed);
Run Code Online (Sandbox Code Playgroud)
经过的时间:
List.GetRange() :0.149秒
List.Take().ToList() :3.625秒
| 归档时间: |
|
| 查看次数: |
5988 次 |
| 最近记录: |