Я знаю, что IEnumerable
ленива, но я не понимаю, почему Enumerable.Range
получает итерация здесь дважды:Почему Enumerable.Range повторяется дважды?
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication
{
class Program
{
static int GetOne(int i)
{
return i/2;
}
static IEnumerable<int> GetAll(int n)
{
var items = Enumerable.Range(0, n).Select((i) =>
{
Console.WriteLine("getting item: " + i);
return GetOne(i);
});
var data = items.Select(item => item * 2);
// data.Count does NOT causes another re-iteration
Console.WriteLine("first: items: " + data.Count());
return data;
}
static void Main()
{
var data = GetAll(3);
// data.Count DOES cause another re-iteration
Console.WriteLine("second: items: " + data.Count());
Console.ReadLine();
}
}
}
Результат:
getting item: 0
getting item: 1
getting item: 2
first: items: 3
getting item: 0
getting item: 1
getting item: 2
second: items: 3
Почему не получить повторно итерацию в «первой «дело, но делает в« втором »?
Почему она не получить повторно итерацию сразу после первого выступа ' var data = items.Select (item => item * 2) '? Происходит ли кеширование? – avo
@avo 'Select' является отложенным методом, поэтому он будет выполнять только итерацию, когда вы на самом деле перечислите« данные ». 'Count' не откладывается, как и другие методы агрегирования (' All', 'Sum',' GroupBy' и т. Д.). –