我遇到了一个奇怪的问题。我在这里重现了这个问题。
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
再次执行。为什么会这样?
答案 0 :(得分:19)
您正在考虑延期执行。当您创建LINQ查询时,它基本上是一个蓝图,表示“在请求时,执行这些步骤来操纵数据源”。这里棘手的部分是这个请求只由一组不同的LINQ操作完成(.ToList()
就是其中之一)。
因此,当您将e.ToList()
调用后,它将随机化数据源,因为这是蓝图所说的必须做的事情。当您再次在同一蓝图上调用.ToList()
时,它会从头开始再次随机化。
蓝图不包含任何状态,只是说明在每一步都应该做些什么。