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

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 似乎再次执行。为什么?

最佳答案

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

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

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

关于c# - IEnumerable 重复函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32936300/

10-15 22:26