Верно ли, что случайные данные внутри ленивого оператора могут оцениваться по-разному во время выполнения? С помощью следующего кода я вижу «wow» многократно напечатанную на консоли. Однако, если я заставляю результат запроса (т. Е. Вызывать ToList()
по номерам xs
и ys
), все выглядит нормально.Случайные числа в запросах linq
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', но я не могу понять, как это сделать, не делая этого очевидным :( – Rawling
@ Rawling 'from x in Enumerable.Range (0, 20000) let rnd = new Random() select rnd.Next(); ' – xanatos