Я пытаюсь поиграться с функциями итератора.
Цель состоит в том, чтобы получить итератор всех Calculation
, GetCalculations
и для этого у меня есть функция GetCalculationFromSheetRowData
, чтобы преобразовать необработанные данные в строго типизированный объект.
Насколько я понимаю, итераторы каким-то образом сохранят состояние функции и при каждом вызове возобновляют цикл с того места, где она остановилась.
Однако, когда я профилирую программу, я вижу 4078 обращений к итератору GetCalculations
, что ожидается, поскольку список RawCalculations содержит 4078 строк, но 4 122 576 обращений к GetCalculationFromSheetRowData
Я пытался разобраться в этом количестве вызовов, но, несмотря на все мои усилия (это не 4078 в квадрате, это не сумма целых чисел от 1 до 4078 и т. Д.), Я не смог понять процесс на карту здесь.
Не могли бы вы помочь мне понять, что происходит, чтобы я мог попытаться исправить это?
//The raw data is populated by an other mecanism.
private IList<IList<object>> RawCalculations { get; }
public IEnumerable<Calculation> GetCalculations()
{
foreach (var row in RawCalculations)
{
if (row.Count == 0)
continue;
yield return GetCalculationFromSheetRowData(row);
}
}
private Calculation GetCalculationFromSheetRowData(IList<object> row)
{
//Takes raw data, as IList<object> and returns a strongly-typed Calculation object
}