Большинство методов LINQ (Enumerable class) являются ленивыми. Так, например, нет ничего плохого в:
var squares = Enumerable.Range(0, Int32.MaxValue).Select(x=>x*x);
Вы можете использовать метод Take, чтобы ограничить результаты:
var 10squares = squares.Take(10);
var smallSquares = squares.TakeWhile(x => x < 10000);
Редактировать: То, что вам нужно избегать, это функции, которые возвращают "лениво", но должны потреблять все перечисляемое для получения результата. Например, группировка или сортировка:
var oddsAndEvens = Enumerable.Range(0, Int32.MaxValue)
.GroupBy(x => x % 2 == 0);
foreach (var item in oddsAndEvens) {
Console.WriteLine(item.Key);
}
(Это, вероятно, даст вам исключение OutOfMemory для 32-разрядного.)