IEnumerable重复函数

本文关键字:函数 IEnumerable | 更新日期: 2023-09-27 18:16:01

我遇到一个奇怪的问题。我在这里重现了这个问题。

Random r = new Random();
List<int> x = new List<int> {1, 2, 3, 4, 5, 6};
var e = x.OrderBy(i => r.Next());
var list1 = e.ToList();
var list2 = e.ToList();
bool b = list1.SequenceEqual(list2);
Console.WriteLine(b); // prints false

直到现在,我认为Linq函数在被调用时才被执行。但是,在这个方法中,似乎在我调用ToList之后,Linq函数OrderBy再次执行。为什么会这样呢?

IEnumerable重复函数

您正在查看延迟执行。当你创建一个LINQ查询时,它基本上是一个蓝图,上面写着"当被请求时,执行这些步骤来操作数据源"。这里棘手的部分是,这个请求只能由一组不同的LINQ操作完成(.ToList()是其中之一)。

所以当你调用e.ToList()时,它将随机化数据源,因为这是蓝图说它必须做的。当你在同一个蓝图上再次调用.ToList()时,它再次从头开始并再次随机化。

蓝图不包含任何状态,它只是说明在每一步中应该做什么。