【发布时间】:2015-05-21 13:27:31
【问题描述】:
惰性语句中的随机数据在运行时可能会得到不同的评估,这是真的吗?使用以下代码,我看到控制台多次打印“哇”。但是,如果我强制查询结果(即在xs 和ys 上调用ToList()),事情似乎工作正常。
public static void Main(string[] args)
{
var generator = new Random();
var xs = from x in Enumerable.Range(0, 20000)
select generator.Next();
var ys = from y in Enumerable.Range(0, 5000)
select generator.Next();
foreach (var x in xs)
{
var q1 = from y in ys where y > x select y;
var q2 = from y in ys where y > x select y;
if (!q1.SequenceEqual(q2))
Console.WriteLine("wow!");
}
Console.WriteLine("done");
Console.ReadLine();
}
我怀疑这与 linq 查询是“懒惰的”这一事实有关。这准确吗?
【问题讨论】:
-
LINQ 查询的“延迟执行”是最常被误解的功能之一。查询总是在迭代查询变量时执行,而不是在创建查询变量时执行。
-
我真的很想提出一个答案,通过对
ys的每次迭代使用new Random来“解决”这个问题,但我不知道该怎么做很明显:( -
@Rawling
from x in Enumerable.Range(0, 20000) let rnd = new Random() select rnd.Next(); -
@xanatos Nah,这似乎并没有做到 - 你会为每个
y而不是每个ys获得一个new Random,我认为这会减慢它的速度,以至于它坏了. -
@Rawling 你说得对:
(from useless in new int[1] let rnd = new Random() from x in Enumerable.Range(0, 20000) select rnd.Next()).ToArray();
标签: c# linq random lazy-sequences