list.Take(100).ToList()与list.GetRange(0,100)

Ale*_*der 10 c# linq

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.GetRangeTake(n).ToList()已经知道新列表的大小更有效,而LINQ方法不知道它的大小.

因此,ToList枚举序列并使用加倍算法将项添加到新列表中,从而连续增加后备阵列.List.GetRange可以预先创建具有正确初始大小的正确列表,然后使用Array.Copy将源列表的子集复制到新列表[ source ]中.


Kęd*_*rzu 7

它要快得多.看一下这个:

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秒