c# - IEnumerable 重复函数

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

最佳答案

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

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

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

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

相关文章:

c# - 从列表中获取通用数据

c# - .NET 中的动态 WSDL 位置

c# - 将下拉列表和文本框中的值插入数据库

c# - 作业兼容性有问题?

silverlight - NHibernate.Linq,WCF RIA 服务,奇怪的错误

c# - 比较两个通用列表并删除重复项

c# - 使用多线程 for 循环

c# - 如何在 asp.net 核心 webapi Controller 中读取请求正文?

c# - 将内联表值函数与 Linq 和 Entity Framework Core 结合使用

c# - 导出到 csv - Linq 查询