IEnumerable重复function

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

Random r = new Random(); List x = new List {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 。 为什么会这样?

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

因此,当您调用e.ToList()时,它将随机化数据源,因为这是蓝图所说的必须做的事情。 然后,当您再次在同一蓝图上调用.ToList()时,它会从开始处再次启动并再次随机化。

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