IEnumerable重复功能

M.k*_*ary 13 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
Run Code Online (Sandbox Code Playgroud)

到目前为止,我认为Linq函数在被调用时会被执行.但是,在我调用ToListLinq函数后OrderBy再次执行此方法.为什么会这样?

Jer*_*vel 19

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

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

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

  • 确切地说:LINQ尽可能使用延迟执行.对于`OrderBy`或`Where`,它仅在被请求时被评估(即通过调用`ToList`).对于其他人,例如`Count`或`Sum`,它会立即执行. (5认同)
  • @YuvalItzchakov你不能计算或总和而不迭代整个集合; 这就是你的意思,对吗? (3认同)