IEnumerable重复功能

时间:2015-10-04 17:31:56

标签: c# linq

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

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再次执行。为什么会这样?

1 个答案:

答案 0 :(得分:19)

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

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

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