Я читал статью о том, как выражения запроса откладывают выполнение. Означает ли это, когда у нас есть коллекция, как:
IEnumerable<int> collection = from i in integers where i % 2 == 0 select i;
Он будет пересчитываться каждый раз при обращении к collection
?
Если так, какова общая практика, чтобы иметь дело с этим? Преобразовать в новую коллекцию?
Кроме того, почему дизайнеры C # выбрали именно этот путь, а не то, где он кэширует результат в коллекции после первого доступа к коллекции?
Кроме того, как среда выполнения узнает, что collection
ведет себя таким образом (откладывает выполнение), в отличие от другого IEnumerable<T>
, который я мог бы создать, используя List<T>
, который не откладывает выполнение?
Edit:
А как насчет таких случаев:
List<int> ints = new List<int> ( ) { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
var even = from i in ints where i % 2 == 0 select i;
ints.AddRange ( new List<int> ( ) { 10, 20, 30, 40, 50 } );
foreach ( int i in even )
{
Console.WriteLine ( i );
}
Выход:
2, 4, 6, 8, 0, 10, 20, 30, 40, 50
Кешируя, будет ли поведение более ожидаемым?