Подтвердить что ты не робот

Функция повторения IEnumerable

У меня возникла странная проблема. Здесь я воспроизвел проблему.

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 выполняется снова. Почему это так?

4b9b3361

Ответ 1

Вы смотрите на отсроченное исполнение. Когда вы создаете запрос LINQ, он в основном представляет собой проект, в котором говорится: "при запросе выполните эти шаги для управления источником данных". Трудная часть здесь заключается в том, что этот запрос выполняется только отдельным набором операций LINQ (.ToList() является одним из них).

Поэтому, когда вы вызываете e.ToList(), как только он будет рандомизировать источник данных, так как это говорит о том, что он должен сделать. Когда вы снова вызываете .ToList() на этом же чертеже, он снова начинается с начала и рандомизируется снова.

План не содержит никакого состояния, он просто говорит, что нужно делать на каждом этапе пути.